XSL:避免使用不同父节点的重复节点

时间:2014-05-22 23:00:34

标签: xml xslt

我有一个看起来像这样的XML

<list>
    <item>
        <name>A</name>
        <name>B</name>
        <name>C</name>
    </item>
    <item>
        <name>B</name>
    </item>
    <item>
        <name>B</name>
        <name>A</name>
    </item>
    <item>
        <name>B</name>
        <name>C</name>
        <name>A</name>
    </item>
</list>

我需要获得没有重复元素的元素。

<items>
    <name>A</name>
    <name>B</name>
    <name>C</name>
</items>

喜欢这个^

2 个答案:

答案 0 :(得分:3)

XSLT 2.0解决方案

使用fn:distinct-values

此XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <items>
      <xsl:for-each select="distinct-values(//name)">
        <name>
          <xsl:value-of select="."/>
        </name>
      </xsl:for-each>
    </items>
  </xsl:template>
</xsl:stylesheet>

将产生此XML输出:

<?xml version="1.0" encoding="UTF-8"?>
<items>
   <name>A</name>
   <name>B</name>
   <name>C</name>
</items>

根据要求提供XML输入文件。

答案 1 :(得分:3)

这是 XSLT 1.0 解决方案,使用Muenchian grouping

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    version="1.0">
    <xsl:output indent="yes"/>

    <xsl:key name="unique-names" match="name" use="." />

    <xsl:template match="list">
        <items>
            <xsl:apply-templates 
                select="item/name[generate-id(key('unique-names', .)) = generate-id(.)]"/>
        </items>
    </xsl:template>

    <xsl:template match="name">
        <xsl:copy>
            <xsl:value-of select="."/> 
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>