我有一个输入xml如下。我的目标是删除从一个到另一个完全匹配的重复元素。
输入xml
<namespaces>
<namespace prefix="dc">http://purl.org/dc/elements/1.1/</namespace>
<namespace prefix="gz">http://www.tso.co.uk/assets/namespace/gazette</namespace>
<namespace prefix="xsl">http://www.w3.org/1999/XSL/Transform</namespace>
<namespace prefix="atom">http://www.w3.org/2005/Atom</namespace>
<namespace prefix="xd">http://www.oxygenxml.com/ns/doc/xsl</namespace>
<namespace prefix="xs">http://www.w3.org/2001/XMLSchema</namespace>
<namespace prefix="xhtml">http://www.w3.org/1999/xhtml</namespace>
<namespace prefix="atom">http://www.w3.org/2005/Atom</namespace>
<namespace prefix="xd">http://www.oxygenxml.com/ns/doc/xsl</namespace>
<namespace prefix="xs">http://www.w3.org/2001/XMLSchema</namespace>
<namespace prefix="xhtml">http://www.w3.org/1999/xhtml</namespace>
<namespace prefix="atom">http://www.w3.org/2005/Atom</namespace>
<namespace prefix="xs">http://www.w3.org/2001/XMLSchema</namespace>
<namespace prefix="gz">http://www.tso.co.uk/assets/namespace/gazette</namespace>
<namespace prefix="gz">http://www.tso.co.uk/assets/namespace/gazette</namespace>
</namespaces>
和预期输出[来自上面的输入xml片段]应该如下:
<namespaces>
<namespace prefix="dc">http://purl.org/dc/elements/1.1/</namespace>
<namespace prefix="gz">http://www.tso.co.uk/assets/namespace/gazette</namespace>
<namespace prefix="xsl">http://www.w3.org/1999/XSL/Transform</namespace>
<namespace prefix="atom">http://www.w3.org/2005/Atom</namespace>
<namespace prefix="xd">http://www.oxygenxml.com/ns/doc/xsl</namespace>
<namespace prefix="xs">http://www.w3.org/2001/XMLSchema</namespace>
<namespace prefix="xhtml">http://www.w3.org/1999/xhtml</namespace>
<namespace prefix="gz">http://www.tso.co.uk/assets/namespace/gazette</namespace>
</namespaces>
我需要一个xslt代码来实现这一目标。 任何的想法?请
答案 0 :(得分:1)
这可以解释为分组问题 - 您希望根据其prefix
属性及其字符串值的组合对元素进行分组,然后仅保留每个组中的第一个元素。在XSLT 2.0中,这是一个简单的for-each-group
<xsl:template match="namespaces">
<namespaces>
<xsl:for-each-group select="namespace" group-by="concat(@prefix, ':', .)">
<xsl:sequence select="." />
</xsl:for-each-group>
</namespaces>
</xsl:template>
在XSLT 1.0中,您可以定义密钥并使用Muenchian技术
<xsl:key name="nsKey" match="namespace" use="concat(@prefix, ':', .)" />
<xsl:template match="namespaces">
<namespaces>
<xsl:copy-of select="namespace[
generate-id() = generate-id(key('nsKey', concat(@prefix, ':', .))[1])]" />
</namespaces>
</xsl:template>
(这假设您的文档中只有一个namespaces
元素,如果您有多个元素,那么该技术仍然有效,但您需要一个更复杂的密钥,包括generate-id(..)
来生成组每个父级而不是每个文档)。