2009-07-23 17 views
3

ドキュメントでユニークなノードを選択することについて話し合っていますが、私の場合はキーを使用できません。どのように)私はノードのセットで作業しているので、ドキュメント上ではありません。XSL:ノードセット内のユニークなノードを選択する方法

ノードセットでキーを設定することはできません。基本的に私は、変数を持っている:

<deviceInstance name="Demux TSchannel" deviceIndex="0"> 
    <structure name="DemuxTschannelCaps"> 
    </structure> 
</deviceInstance> 
<deviceInstance name="Demux TSchannel" deviceIndex="1"> 
    <structure name="DemuxTschannelCaps"> 
    </structure> 
</deviceInstance> 
<deviceInstance name="Demux TSchannel" deviceIndex="3"> 
    <structure name="otherCaps"> 
    </structure> 
</deviceInstance> 

そして、私はその<structure>要素を選択するのか分からない:

<xsl:variable name="limitedSet" select=" 
    $deviceInstanceNodeSet[position() &lt;= $tableMaxCol]" 
/> 

自体が<structure>要素 ノードセットを含む<deviceInstance>ノードは、このように表現することができるが含まれています異なる名前しか持っていない。 $limitedSet

<structure name="DemuxTschannelCaps"></structure> 
<structure name="otherCaps"></structure> 

私は

select="$limitedSet//structure[not(@name=preceding::structure/@name)]" 

を試してみましたが、前の軸はすべて文書に沿って行くといない:これを選択すると、この例にある、2つの<structure>の要素を返すでしょうか?

私は立ち往生しています、誰かが私を助けることができます。ありがとうございました。

答えて

3
<xsl:variable name="structure" select="$limitedSet//structure" /> 

<xsl:for-each select="$structure"> 
    <xsl:variable name="name" select="@name" /> 
    <xsl:if test="generate-id() = generate-id($structure[@name = $name][1])"> 
    <xsl:copy-of select="." /> 
    </xsl:if> 
</xsl:for-each> 

これは、キーによって支援することができます

<xsl:key name="kStructureByName" match="structure" use=" 
    concat(ancestor::device[1]/@id, ',', @name) 
" /> 
<!-- ... --> 
<xsl:variable name="name" select="concat(ancestor::device[1]/@id, ',', @name)" /> 
<xsl:if test="generate-id() = generate-id(key('kStructureByName', $name)[1])"> 
+0

これは次のとおりです。

<xsl:key name="kStructureByName" match="structure" use="@name" /> <!-- ... --> <xsl:if test="generate-id() = generate-id(key('kStructureByName', $name)[1])"> 

あなたの入力に応じて、キーがいくつかの追加のコンテキスト情報を取得する必要があります私の一日を節約するすばらしい答え、そのすばやい返事に感謝します。このサイトは素晴らしく、この回答にランク付けするために登録します。 Tahnkはあなたです。 SeB。 – SeB

+0

私はあなたの重要な提案を考えましたが、複数のデバイスの中に単一の構造体が必要であり、あなたの提案は単一のデバイスに対してのみ機能するため、これは機能しません。 – SeB

+0

@ SeB:あなたが何を意味するのかわかりません - 私の提案(少なくとも2番目のバージョンのキー)は複数のデバイスで動作します。もちろん、実際のXMLに "使用"式を適合させる必要がありますが、不可能ではありません。 – Tomalak

1
select="$limitedSet//structure[not(@name=preceding::structure[count($limitedSet) = count($limitedSet | ..)]/@name)]" 
+0

私が言ったように、axi applisはすべての文書であり、ノードセットではないと思います。さらに私の前の兄弟の理解には、別のデバイスに行くのではありません。構造体のインスタンス。 しかし、とにかく試していただきありがとうございます。 – SeB

+0

'preceding'と' following'軸はすべての文書に適用されますが、 'preceding-sibling'と' following-sibling'は同じ親を持つノードにのみ適用されます。しかし、他の 'deviceInstance'要素のノードを考慮していないのは間違いありません。 –

+0

更新されたバージョンをお試しください。 '$ limitedSet'にノードが存在するかどうかをテストするためのハックを考えなければなりませんでした。 –

関連する問題