我在寻找一个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>
其中“...”表示任何数量的其他任何标签的存在。
编辑:有可能是两个重复的孩子之间的任何
一个简单而直接的方法忽略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>
你有一个解决方案,但它可能是更有效地使用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>