2017-02-03 5 views
0

からユニークな要素を抽出する入力はこれです:は、例えば、入力XSLT

<root> 
<command name="comm1">aa</command> 
<command name="comm2">bb</command> 
<command name="comm3">cc</command> 
<command name="comm3">dd</command> 
<command name="comm2">ee</command> 
<command name="comm1">ff</command> 
<command name="comm5">gg</command> 
</root> 

所望の出力がこれです:

<root> 
<command name="comm1">aa</command> 
<command name="comm2">bb</command> 
<command name="comm3">cc</command> 
<command name="comm5">gg</command> 
</root> 

あなたは出力で、私たちが持っていないことがわかりますテキストタグはここでは重要ではありません。

+0

を明記してください

<xsl:template match="command"> <xsl:if test="not(preceding-sibling::command[@name = current()/@name])"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:if> </xsl:template> 

(他の方法があるが、その一つがシンプルである)はXSLTプロセッサ必要になります使用している。 –

+0

「入力XSLTから一意の要素を抽出する」ではなく、「XSLTを使用して入力XMLから一意の要素を抽出する」のはずですか?参照:http://dx.doi.org/10.14337/XMLLondon17.Gibson01 – holmesw

答えて

0

XSLT 2.0にアクセスできる場合は、これを行う最も簡単な方法は、おそらく恒等変換を使用することです(この変換でこの作業を行うのはと仮定します)。 2つのテンプレートが必要です:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="command[preceding-sibling::command[@name = current()/@name]]"/> 

最初のテンプレートは、出力への入力を変更しないままコピーします。第2のテンプレートは、すべての<command>要素を抑制します。<command>要素は、@name属性と同じ値を持っています。あなたが唯一のXSLT 1.0へのアクセス権を持っている場合は

我々のようなものを有する第2のテンプレートを置き換えることができます。

+0

これは良い方法ではありません。なぜここをクリックしてください:http://www.jenitennison.com/xslt/grouping/muenchian.html –

+0

はい。私はそれを認識していますが、私が言ったように、私は簡単に行くつもりでした。より良い解決策は鍵ですが、鍵を説明する必要があります。 –

+2

少なくともXSLT 2.0では、より良い解決策は 'xsl:for-each-group'と' distinct-values() 'のどちらかを使うことです。 Muenchianのグループ分けについてはこれまで何度も説明されています(例えば、上記リンク先の記事など)。 –