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>

其中“...”表示存在任意数量的任何其他标签。

编辑:两个重复的孩子之间可能有任何东西

4

2 回答 2

2

一种简单而直接的方法来忽略具有与同一父元素的前一个元素相同内容的 am 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 分组可能更有效:

<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 回答