我需要删除完全匹配的重复元素

时间:2013-09-03 15:12:22

标签: xslt

我有一个输入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代码来实现这一目标。 任何的想法?请

1 个答案:

答案 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(..)来生成组每个父级而不是每个文档)。