0

親の子要素の重複を排除するための XSLT 変換を探しています。私の場合、親と子の両方が指定されています (つまり、どの要素の子も重複排除したくありません)。

<ID>たとえば、次の子を重複排除したいとします。<ROWSET>

入力:

<ROWSET>
    <ROW>
         <ID> 1 </ID>
         ...
         <ID> 1 </ID>
         ...
    </ROW>
    <ROW>
         <ID> 2 </ID>
         ...
         <ID> 2 </ID>
         ...
    </ROW>
    ...
</ROWSET>

出力を

<ROWSET>
    <ROW>
         <ID> 1 </ID>
         ...
    </ROW>
    <ROW>
         <ID> 2 </ID>
         ...
    </ROW>
    ...
</ROWSET>

ここで、「...」は、任意の数のその他のタグの存在を示します。

編集:2つの重複した子の間に何かがあるかもしれません

4

2 に答える 2

2

同じ親の前の要素と同じコンテンツを持つ ID を持つ ID を無視する簡単で直接的なアプローチ。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

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

</xsl:stylesheet>
于 2013-05-23T12:45:07.543 に答える
1

解決策はありますが、 Muenchian groupingを使用する方が効率的かもしれません:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="equal" match="ROW/ID" use="concat(generate-id(..), '|', .)"/>

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

<xsl:template match="ROW/ID[not(generate-id() = generate-id(key('equal', concat(generate-id(..), '|', .))[1]))]"/>

</xsl:stylesheet>
于 2013-05-23T13:36:45.337 に答える