2009-07-23 36 views
2

同じレベルのノード名のリストを重複なく表示することを検討しています。XSLTで重複する同じレベルの要素を削除する

のは、私はC、D、E、Fが表示されるようにしたいと思います

<a> 
    <b> 
     <c /> 
     <d /> 
     <d /> 
    </b> 
    <b> 
     <e /> 
     <c /> 
     <f /> 
    </b> 
</a> 

があるとしましょう。私は出力から重複する兄弟を削除する同様の問題へのいくつかのソリューションを見つけましたが、私は重複した "いとこ"を排除するのに問題があります。

答えて

0

XPath先行兄弟軸を使用し、同じローカル名を確認します。未定義:

<xsl:template match="c|d|e|f"> 
    <xsl:if test="local-name(.) != local-name(preceding-sibling::*[1])"> 
     <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 

IOWは、要素が先行兄弟と同じ名前を持つ場合、コピーされません。

+0

私はあなたが '先行sibling'を意味すると思います。 ;-)また、同じ*レベルのすべてのノードでは動作しません。同じ親にあるノードに対してのみ*、*はドキュメント内で既にソートされている場合にのみ動作します。 – Tomalak

+0

ありがとうございます。私は軸名を修正しました。私は今、これがOPの問題を解決しないことを認識しています。 –

+0

ありがとう!これは私の問題を完全に解決しました! –

1

一つの可能​​性:あなたが提供するXMLのための

<!-- make all element nodes accessible by their nesting level --> 
<xsl:key name="kNodesByLevel" match="*" use="count(ancestor-or-self::*)" /> 

<xsl:template match="/"> 
    <!-- select all nodes on one particular level --> 
    <xsl:variable name="lvl" select="key('kNodesByLevel', 3)" /> 

    <!-- step through them... --> 
    <xsl:for-each select="$lvl"> 
    <xsl:sort select="name()" /> 
    <xsl:variable name="name" select="name()" /> 
    <!-- ... and group them by node name --> 
    <xsl:if test="generate-id() = generate-id($lvl[name() = $name][1])"> 
     <xsl:copy-of select="." /> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

出力:

<c /> 
<d /> 
<e /> 
<f /> 
関連する問題