需要帮助使用XSLT从输入xml中删除重复节点
这就是我的XML的样子,
<?xml version="1.0"?>
<NodeA NodeAattr="123">
<NodeB NodeBattr="456"></NodeB>
<NodeC>
<NodeD="ValueD">
<NodeE Name="ValueABC">
<NodeF Value="0"></NodeF >
</NodeE >
<NodeE Name="ValueABC">
<NodeF Value="0"></NodeF >
</NodeE>
</NodeD>
</NodeC>
</NodeA>
我的最终输出应该是
<NodeA NodeAattr="123">
<NodeB NodeBattr="456"></NodeB>
<NodeC>
<NodeD="ValueD">
<NodeE Name="ValueABC">
<NodeF Value="0"></NodeF>
</NodeE >
</NodeD>
</NodeC>
</NodeA>
此处Node E的Name属性具有重复值。基于此属性,我需要消除重复。
如果有人可以帮助我获取输出所需的XSLT,那将会非常有帮助。 我只能使用XSLT 1.0
答案 0 :(得分:1)
如果只有两个<NodeE>
元素具有相同的父元素,则认为它们是重复的,这可能是最简单的解决方案:
<?xml version="1.0"?>
<NodeA NodeAattr="123">
<NodeB NodeBattr="456"></NodeB>
<NodeC>
<NodeD Name="ValueD">
<NodeE Name="ValueABC">
<NodeF Value="0"></NodeF>
</NodeE>
<NodeE Name="ValueABC">
<NodeF Value="0"></NodeF>
</NodeE>
</NodeD>
<!-- Added another <NodeD> element for demonstration -->
<NodeD>
<NodeE Name="ValueABC">
<NodeF Value="0"></NodeF>
</NodeE>
<NodeE Name="ValueDEF">
<NodeF Value="0"></NodeF>
</NodeE>
</NodeD>
</NodeC>
</NodeA>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!--
Identity transform: copy elements and attributes from input file as is
-->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!--
Drop <NodeE> elements with a preceding <NodeE> sibling that has the same
@Name attribute value as the current element
-->
<xsl:template
match="NodeE[preceding-sibling::NodeE[@Name = current()/@Name]]"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<NodeA NodeAattr="123">
<NodeB NodeBattr="456"/>
<NodeC>
<NodeD Name="ValueD">
<NodeE Name="ValueABC">
<NodeF Value="0"/>
</NodeE>
</NodeD>
<NodeD>
<NodeE Name="ValueABC">
<NodeF Value="0"/>
</NodeE>
<NodeE Name="ValueDEF">
<NodeF Value="0"/>
</NodeE>
</NodeD>
</NodeC>
</NodeA>
另一方面,如果<NodeE>
元素在整个文档中应被视为重复,则可以使用Muenchian分组:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kNode" match="NodeE" use="@Name"/>
<!--
Identity transform: copy elements and attributes from input file as is
-->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!--
Use Muenchian grouping to apply unique NodeE elements.
See http://www.jenitennison.com/xslt/grouping/muenchian.html
-->
<xsl:template match="NodeE[generate-id() =
generate-id(key('kNode', @Name)[1])]">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- Drop other <NodeE> elements -->
<xsl:template match="NodeE"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<NodeA NodeAattr="123">
<NodeB NodeBattr="456"/>
<NodeC>
<NodeD Name="ValueD">
<NodeE Name="ValueABC">
<NodeF Value="0"/>
</NodeE>
</NodeD>
<NodeD>
<NodeE Name="ValueDEF">
<NodeF Value="0"/>
</NodeE>
</NodeD>
</NodeC>
</NodeA>
答案 1 :(得分:-1)
使用“深度相等”功能比较两个项目()。检查一下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="NodeE">
<xsl:choose>
<xsl:when test="deep-equal(self::NodeE, following-sibling::NodeE)"/>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="* | @*"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>