我正在尝试选择所有节点1)来自具有特定属性的节点并且2)自己具有特定属性.所以,如果我有以下
XML:
<node id="1"><child attr="valueOfInterest"/></node> <node id="2"><child attr="boringValue"/></node> ... <node id="3"><child attr="valueOfInterest"/></node> <node id="4"><child attr="boringValue"/></node> <node id="5"><child attr="boringValue"/></node> <node id="6"><child attr="boringValue"/></node> ...
我的XSLT遍历每个节点标记.在每个节点,我希望它选择自最近节点以来发生的所有先前节点,该节点具有attr为valueOfInterest的子节点.所以,如果我在节点#2,我想要一个空节点集.如果我在节点#6,我想选择节点#4和5.我目前有以下XSLT:
<xsl:variable name="prev_vals" select="preceding-sibling::node/child[@attr = $someValueICareAbout]/@attr"/>
因此,此XSLT获取所有先前的特定值的attr值.我如何仅获取那些位于其子节点具有特定attr值的最新节点之后的节点之前的attr值(即“valueOfInterest”)?节点标签上的id属性不保证会增加,因此我们无法与之进行比较.
编辑:我认为这些可能有用:
<xsl:variable name="prev_children_of_interest" select="preceding-sibling::node/child[@attr != $someValueICareAbout]"/> <xsl:variable name="mru_child_of_interest" select="$prev_children_of_interest[count($prev_children_of_interest)]"/>
因此,所有以前的子标签都带有attr = valueOfInterest,然后是最近使用的(最接近当前节点)子标签,它具有我正在寻找的属性.从mru_child_of_interest我们可以找到最近使用的父标记,但是我们如何查找该标记之后的节点?
我不确定我是否正确理解你的问题,但这里有一些XSL 1.0(额外的每个节点属性仅供参考):
原文链接:https://www.f2er.com/xml/292319.html<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="nodes"> <xsl:copy> <xsl:apply-templates select="node"/> </xsl:copy> </xsl:template> <xsl:template match="node"> <xsl:variable name="someValueICareAbout">valueOfInterest</xsl:variable> <xsl:variable name="recentParticularNode" select="preceding-sibling::node[child/@attr = $someValueICareAbout][1]"/> <xsl:variable name="recentParticularNodePosition" select="count($recentParticularNode/preceding-sibling::node) + 1"/> <xsl:variable name="currentPosition" select="position()"/> <xsl:if test="child/@attr != $someValueICareAbout"> <each-nodes id="{@id}" cp="{$currentPosition}" rpnp="{$recentParticularNodePosition}"> <xsl:copy-of select="../node[position() > $recentParticularNodePosition and position() < $currentPosition]"/> </each-nodes> </xsl:if> </xsl:template> </xsl:stylesheet>
输入XML:
<?xml version="1.0" encoding="UTF-8"?> <nodes> <node id="1"><child attr="valueOfInterest"/></node> <node id="2"><child attr="boringValue2"/></node> <node id="3"><child attr="valueOfInterest"/></node> <node id="4"><child attr="boringValue4"/></node> <node id="5"><child attr="boringValue5"/></node> <node id="6"><child attr="boringValue6"/></node> </nodes>
结果XML:
<?xml version="1.0" encoding="UTF-8"?> <nodes> <each-nodes id="2" cp="2" rpnp="1"/> <each-nodes id="4" cp="4" rpnp="3"/> <each-nodes id="5" cp="5" rpnp="3"> <node id="4"> <child attr="boringValue4"/> </node> </each-nodes> <each-nodes id="6" cp="6" rpnp="3"> <node id="4"> <child attr="boringValue4"/> </node> <node id="5"> <child attr="boringValue5"/> </node> </each-nodes> </nodes>