我的输入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代码来实现这一点。有什么想法吗?请
发布于 2013-09-03 15:15:55
这可以解释为分组问题--您希望根据元素的prefix属性和字符串值的组合对元素进行分组,然后只保留每个组中的第一个元素。在XSLT2.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>在XSLT1.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(..) )来生成每个父类而不是每个文档的组)。
https://stackoverflow.com/questions/18595765
复制相似问题