下面是我的示例XML文件,如果其值为“H”则删除特定节点的重复项,然后它将删除Test5中的所有重复项,其值为H else其他值test5可以具有值,无需删除任何重复项.Any Help非常感谢:以下是场景:
场景1:对于Test3值,如果超过1 H可用,则在Test5中仅保留一个H值,然后删除其他H并保留一个,不要删除Test3的其他Test5值和重复值,即E,T,M等
<Report_Data>
<Report_Entry>
<Test1>ABC</Test1>
<Test2>ABC</Test2>
<Test3>000</Test3>
<Test4>ABC</Test4>
<Test5>H</Test5>
<Test6>Match</Test6>
</Report_Entry>
<Report_Entry>
<Test1>ABC</Test1>
<Test2>ABC</Test2>
<Test3>000</Test3>
<Test4>ABC</Test4>
<Test5>E</Test5>
<Test6>Match</Test6>
</Report_Entry>
<Report_Entry>
<Test1>ABC</Test1>
<Test2>ABC</Test2>
<Test3>000</Test3>
<Test4>ABC</Test4>
<Test5>H</Test5>
<Test6>Match</Test6>
</Report_Entry>
<Report_Entry>
<Test1>ABC</Test1>
<Test2>ABC</Test2>
<Test3>000</Test3>
<Test4>ABC</Test4>
<Test5>H</Test5>
<Test6>Match</Test6>
</Report_Entry>
</Report_Data>
预期产出:
<Report_Data>
<Report_Entry>
<Test1>ABC</Test1>
<Test2>ABC</Test2>
<Test3>000</Test3>
<Test4>ABC</Test4>
<Test5>H</Test5>
<Test6>Match</Test6>
</Report_Entry>
<Report_Entry>
<Test1>ABC</Test1>
<Test2>ABC</Test2>
<Test3>000</Test3>
<Test4>ABC</est4>
<Test5>E</Test5>
<Test6>Match</Test6>
</Report_Entry>
</Report_Data>
使用XSLT进行分组和删除重复项:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:key name="Test5-H" match="Test5" use="."/>
<xsl:template match="Report_Data">
<catalog>
<xsl:apply-templates/>
</catalog>
</xsl:template>
<xsl:template match="Report_Entry">
<xsl:copy>
<xsl:copy-of select="@*"/>
<Test5>
<xsl:for-each select="Test5[count(. | key('Test5-H', .)[1]) = 1]">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</Test5>
</xsl:copy>
</xsl:template>
</xsl:transform>
以上代码的问题是它删除了test5的所有重复项,但我只需要删除如果test5的值为H.
答案 0 :(得分:0)
您说要删除特定元素,但与Report_Entry
匹配的当前模板始于复制Report_Entry
<xsl:template match="Report_Entry">
<xsl:copy>
您可能需要做的是添加xsl:if
,使用您现有的表达式进行分组,此处
<xsl:template match="Report_Entry">
<xsl:if test="Test5[count(. | key('Test5-H', .)[1]) = 1]">
<xsl:copy-of select=".">
</xsl:if>
</xsl:template>
但是,将密钥更改为此可能稍微合乎逻辑,因为您实际上是按Report_Entry
元素对Test5
元素进行分组
<xsl:key name="Test5-H" match="Report_Entry" use="Test5"/>
然后,当你删除元素时,你有一个这样的模板
<xsl:template match="Report_Entry[not(count(. | key('Test5-H', Test5)[1]) = 1)]" />
这需要与身份模板结合使用。
试试这个XSLT
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="Test5-H" match="Report_Entry" use="Test5"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Report_Entry[not(count(. | key('Test5-H', Test5)[1]) = 1)]" />
</xsl:transform>