我已经做了更多关于删除重复元素的研究。 大多数地方,他们使用具有已定义元素名称的关键函数。 就我而言,我没有任何已定义的元素。 我试图修改示例
输入XML:
<Test>
<Req>
Test
<A name="Test">Inp1</A>
<B>Inp2</B>
<D>Inp3</D>
</Req>
<Resp>
<A name="Test222">Inp1</A>
<A>Out1</A>
<B>Inp1</B>
<B>Inp2</B>
<C>Inp3</C>
</Resp>
</Test>
XSL :(我在参考了很多例子之后尝试过。)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:key name="unique" match="/Test" use="*"/>
<xsl:template match="/">
<xsl:for-each select="key('unique',//*)">
<xsl:if test="generate-id() = generate-id(key('unique',.)[1])">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
预期产出:
<Test>
<Req>
Test
<A name="Test">Inp1</A>
<B>Inp2</B>
<D>Inp3</D>
</Req>
<Resp>
<A>Out1</A>
<B>Inp1</B> <!-- Inp1 is already available for <A>. Not for <B>. Should not remove this -->
<C>Inp3</C> <!-- Inp3 is already available for <D>. Not for <C>. Should not remove this -->
</Resp>
</Test>
我们有匹配元素名称和值。 (我们必须忽略这个属性)。
仅在XSLT 1.0或1.1上需要解决方案
对此表示感谢。谢谢:)
答案 0 :(得分:1)
以这种方式尝试:
XSLT 1.0
<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="unique" match="Req/* | Resp/*" use="concat(local-name(), '|', .)"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Req/* | Resp/*">
<xsl:if test="generate-id() = generate-id(key('unique', concat(local-name(), '|', .))[1])">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入:
<Test>
<Req>
Test
<A name="Test">Inp1</A>
<B>Inp2</B>
<D>Inp3</D>
</Req>
<Resp>
<A name="Test222">Inp1</A>
<A>Out1</A>
<B>Inp1</B>
<B>Inp2</B>
<C>Inp3</C>
</Resp>
</Test>
结果是:
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Req>
Test
<A name="Test">Inp1</A>
<B>Inp2</B>
<D>Inp3</D>
</Req>
<Resp>
<A>Out1</A>
<B>Inp1</B>
<C>Inp3</C>
</Resp>
</Test>