2011-03-05 50 views
4

如果我稱之爲XSLT模板,像這樣: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> 

回答

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調用。

+0

+1好的解決方案。 – 2011-03-05 22:41:06

3

XPath軸反映了輸入樹(或臨時樹,如果節點在臨時樹中)中某個節點的關係。它們與處理順序無關(以下節點的兄弟節點不一定是您選擇處理的節點之一)。

這與position()不同 - 認爲position()告訴你一些關於其樹中節點位置的常見錯誤,但它實際上是節點在選擇處理的節點列表中的位置。

+0

+1好答案。 – 2011-03-05 22:40:38