XPath轴是否尊重Xslt排序?

时间:2011-03-05 17:02:14

标签: xslt sorting xpath

如果我像这样调用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>

2 个答案:

答案 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()告诉你某个节点在其树中的位置是一个常见的错误,但它实际上是节点在选择进行处理的节点列表中的位置。