2011-03-05 7 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良い解決策。 –

3

XPath軸は、入力ツリー内のノード(またはノードが一時ツリーにある場合は一時的なツリー)のノードの関係を反映します。それらは処理の順序とは関係ありません(ノードの次の兄弟は、必ずしもあなたが処理のために選択したノードの1つではありません)。

これはposition()とは異なります。position()はツリー内のノードの位置について何かを知らせるのがよくある間違いですが、実際には処理のために選択されたノードのリスト内のノードの位置です。

+0

+1良い答え。 –

関連する問題