我正在尝试选择所有节点1)来自具有特定属性的节点并且2)自己具有特定属性.所以,如果我有以下
XML:
@H_404_1@<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:
@H_404_1@<xsl:variable name="prev_vals" select="preceding-sibling::node/child[@attr = $someValueICareAbout]/@attr"/>因此,此XSLT获取所有先前的特定值的attr值.我如何仅获取那些位于其子节点具有特定attr值的最新节点之后的节点之前的attr值(即“valueOfInterest”)?节点标签上的id属性不保证会增加,因此我们无法与之进行比较.
编辑:我认为这些可能有用:
@H_404_1@<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(额外的每个节点属性仅供参考):
@H_404_1@<?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:
@H_404_1@<?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:
@H_404_1@<?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>