2

私は次のデータを持っています

<parent>
    <child>APPLES</child>
    <child>APPLES</child>
    <child>APPLES</child>
</parent>
<parent>
    <child>APPLES</child>
    <child>BANANA</child>
    <child>APPLES</child>
</parent>

親ノードを比較する簡単な方法はありますか? または、for-each 内に for-each をネストし、すべての子を position() で手動でテストする必要がありますか?

4

1 に答える 1

3

XSLT 2.0 には関数http://www.w3.org/TR/2013/CR-xpath-functions-30-20130521/#func-deep-equalがあるため、テンプレートを記述できます

<xsl:template match="parent[deep-equal(., preceding-sibling::parent[1])]">...</xsl:template>

parent前の兄弟と等しい要素を処理しますparent

XSLT 1.0 でそれを行いたい場合は、プレーン テキスト コンテンツを持つ一連の子要素の単純なケースでは、テンプレートを記述するだけで十分です。

<xsl:template match="parent" mode="sig">
  <xsl:for-each select="*">
    <xsl:if test="position() &gt; 1">|</xsl:if>
    <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:template>

そして、次のように使用します。

<xsl:template match="parent">
  <xsl:variable name="this-sig">
    <xsl:apply-templates select="." mode="sig"/>
  </xsl:variable>
  <xsl:variable name="pre-sig">
    <xsl:apply-templates select="preceding-sibling::parent[1]" mode="sig"/>
  </xsl:variable>
  <!-- now compare e.g. -->
  <xsl:choose>
    <xsl:when test="$this-sig = $pre-sig">...</xsl:when>
    <xsl:otherwise>...</xsl:otherwise>
  </xsl:choose>
</xsl:template>

より複雑なコンテンツについては、「署名」文字列を計算するテンプレートの実装を改良する必要があります。Web を検索することをお勧めします。Dimitre Novatchev が以前の同様の質問に解決策を投稿したと確信しています。

于 2013-08-28T09:09:19.793 に答える