0

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

4

1 回答 1

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

于 2013-09-03T15:15:55.073 回答