2

同じレベルのノード名のリストを重複せずに表示したいと思っています。

私が持っているとしましょう

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

c、d、e、fを表示したいのですが。同様の問題に対するいくつかの解決策を見つけて、出力から重複する兄弟を削除しましたが、重複する「いとこ」を削除するのに問題があります。

4

2 に答える 2

1

1 つの可能性:

<!-- 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>

指定した XML の出力:

<c />
<d />
<e />
<f />
于 2009-07-23T14:25:15.803 に答える
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、要素がその前の兄弟と同じ名前を持つ場合、それはコピーされません。

于 2009-07-23T13:56:17.887 に答える