2016-07-22 12 views
0

ノードがXSLT 1.0でソートされているときに、XSLTノードの次の兄弟を選択する方法を試してみましょう。私は検索しましたが、並べ替えられたノードには何も見つかりません。の兄弟を選択するだけです。ノードです。ソート済みノードの次の兄弟の選択

データ

<data> 
    <number order='4'>Four</number> 
    <number order='1'>One</number> 
    <number order='3'>Three</number> 
    <number order='2'>Two</number> 
</data> 

コード

<xsl:for-each select="/data/number"> 
    <xsl:sort select="@order"/> 
    <xsl:if test="position() mod 2 = 1"> 
     <xsl:value-of select="text()"/> 
     <xsl:text> - </xsl:text> 
     <xsl:value-of select="following-sibling::*/text()"/> 
    </xsl:if> 
</xsl:for-each> 

の予想される出力

One - Two 
Three - Four 

実際の出力は

One - Three 
Three - Two 
+0

を行うのは簡単に十分なようです。 position()はstring.imを返すので、実際に試してみるかどうかわからない –

答えて

1

ノードのシーケンスを並べ替えると、新しいシーケンスで同じノードが取得されます。彼らは同じノードなので、彼らはいつも同じ兄弟を持っています。ノードを結果ツリーにコピーすると、コピーには新しい兄弟が含まれますが、ソートアクションのためではなく、結果ツリーにそれらを書き込む動作が原因です。

これを置くもう1つの方法:兄弟ではないノードのシーケンスを処理しているので、兄弟姉妹を使用してシーケンス内の次のノードを取得することはできません。

XSLT 2.0ではソートされたノードのシーケンスを処理する方がはるかに簡単になり、そのようなシーケンスを変数にバインドすることができます。 XSLT 1.0にはノードセットしかないため、特定の順序のノードのシーケンスは一時的にしか存在できません。

しかし、この特定のケースでは、それはテストの内側(位置())MOD 2 = 1番号を使用して試すことができます

<xsl:value-of select="."/> 
<xsl:if test="position() mod 2 = 1"> 
    <xsl:text> - </xsl:text> 
</xsl:if> 
+0

ありがとうございます。私の実際の問題は、ここの解決策では解決されませんでしたが、私が試みたことが可能かどうかについて私の質問に答えました。私はそれが私が最も尋ねた質問に答えるので、これを受け入れられた答えとしてマークしています。 –

1

それだけでソートされていないノードの兄弟を選択します。

これは間違いありません。デフォルトのソートデータ型がtextであることを

<xsl:for-each select="/data/number"> 
    <xsl:sort select="@order"/> 
    <xsl:value-of select="."/> 
    <xsl:choose> 
     <xsl:when test="position() mod 2 = 1"> 
      <xsl:text>-</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

注;:なぜあなたは単にをしません

<xsl:sort select="@order" data-type="number"/> 
+0

これは私の単純化された例では機能しますが、このコードを使用しようとしている実際の場所は、表の行タグは分割されています。 XSLT 1.0でソートされたノードの兄弟を取得することはできません。 –

+1

本当にそれらが兄弟である必要がある場合は、それらを最初に変数にコピーする(または、新しいノードとして再作成する)必要があります。また、XSLT 1.0では、その変数をノード・セットに変換してからさらに処理する必要があります。 –

関連する問題