根据XSLT中的属性值删除重复项

时间:2017-03-06 14:13:09

标签: xml xslt

我有这个XML代码:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <A>
        <B>
            <C index="0">
                <element index="0">one</element>
                <element index="1">two</element>
                <keyElement index="1">key</keyElement >
            </C>
            <C index="0">
                <element index="0">one</element>
                <element index="1">two</element>
                <keyElement index="1">key</keyElement >
            </C>
        </B>
    </A>
</root>

我希望根据索引值删除重复项。我已经在使用迭代中使用的 keyElement 的键。

<xsl:key name="group-by-keyElement" match="C" use="keyElement" />
<xsl:for-each select="key('group-by-keyElement', keyElement )">

在同一次迭代中,我需要删除重复项,以便输出只显示C中的值。

想要的结果是:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <A>
        <B>
            <C index="0">
                <element index="0">one</element>
                <element index="1">two</element>
                <keyElement index="1">key</keyElement >
            </C>
        </B>
    </A>
</root>

1 个答案:

答案 0 :(得分:1)

您写道:我想根据索引值删除重复项。 我假设,您的意思是 C 标记中 index 属性的值。

下面有一个解决方案,在 XSLT 1.0 XSLT 2.0 中工作。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:strip-space elements="*"/>

  <xsl:key name="indexKey" match="//C[@index]" use="@index" />

  <xsl:template match="C">
    <xsl:if test="generate-id()=generate-id(key('indexKey', @index)[1])">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
</xsl:transform>

关键是模板匹配 C 标签。

要做的第一件事是检查 id 是否为当前节点生成 (generate-id())等于为第一个元素生成的 id 由名为 indexKey key 中的key函数返回的值和 当前的索引属性。

如果是这种情况,那么:

  • 制作当前元素的(浅)副本。
  • 将模板应用于当前元素的内容。
相关问题