如果我像这样调用xslt模板:
<xsl:template match="hist:Steps">
<dgml:Links>
<xsl:apply-templates select="hist:Step">
<xsl:sort data-type="text" select="hist:End" order="ascending"/>
</xsl:apply-templates>
</dgml:Links>
</xsl:template>
下面模板中的following-sibling
轴是否会询问文档顺序或排序顺序?
<xsl:template match="hist:Step">
<xsl:if test="following-sibling::hist:Step">
<dgml:Link>
<xsl:attribute name="Source">
<xsl:value-of select="hist:Workstation"/>
</xsl:attribute>
<xsl:attribute name="Target">
<xsl:value-of select="following-sibling::hist:Step/hist:Workstation"/>
</xsl:attribute>
</dgml:Link>
</xsl:if>
</xsl:template>
答案 0 :(得分:3)
XSLT采用输入树并将其转换为结果树,您的路径表达式始终在输入树上运行,因此您要查找的任何兄弟都将在输入树中导航到。使用XSLT 2.0(或使用XSLT 1.0和扩展函数,如exsl:node-set http://www.exslt.org/exsl/index.html),您可以使用临时树创建变量,然后可以在其中导航。
<xsl:variable name="rtf1">
<xsl:for-each select="hist:Step">
<xsl:sort data-type="text" select="hist:End" order="ascending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($rtf1)/hist:Step"/>
然后,将处理已排序的步骤元素的临时节点集。
使用XSLT 2.0,您不需要exsl:node-set调用。
答案 1 :(得分:3)
XPath轴反映输入树中节点的关系(如果节点位于临时树中,则反映临时树)。它们与处理顺序无关(节点的以下兄弟节点甚至不一定是您选择进行处理的节点之一)。
这与position()不同 - 认为position()告诉你某个节点在其树中的位置是一个常见的错误,但它实际上是节点在选择进行处理的节点列表中的位置。