如何删除重复的xml节点并仅保留输出中的一个重复条目

时间:2014-09-03 11:32:30

标签: xml xslt

我的输入是:

<?xml version = "1.0" encoding = "UTF-8"?>
<root>
    <MDMInput>
        <Input>
            <WileyProductCategory>PJ</WileyProductCategory>
            <FullfilmentType>subscription</FullfilmentType>
            <Frequency/>
        </Input>
        <Input>
            <WileyProductCategory>EJ</WileyProductCategory>
            <FullfilmentType>onetime</FullfilmentType>
            <Frequency/>
        </Input>
        <Input>
            <WileyProductCategory>EJ</WileyProductCategory>
            <FullfilmentType>subscription</FullfilmentType>
            <Frequency/>
        </Input>
        <Input>
            <WileyProductCategory>EJ</WileyProductCategory>
            <FullfilmentType>subscription</FullfilmentType>
            <Frequency/>
        </Input>
    </MDMInput>
</root>

所需的输出是:

<?xml version = "1.0" encoding = "UTF-8"?>
<root>
    <MDMInput>
        <Input>
            <WileyProductCategory>PJ</WileyProductCategory>
            <FullfilmentType>subscription</FullfilmentType>
            <Frequency/>
        </Input>
        <Input>
            <WileyProductCategory>EJ</WileyProductCategory>
            <FullfilmentType>onetime</FullfilmentType>
            <Frequency/>
        </Input>
        <Input>
            <WileyProductCategory>EJ</WileyProductCategory>
            <FullfilmentType>subscription</FullfilmentType>
            <Frequency/>
        </Input>
    </MDMInput>
</root>

在输入XML中,2个输入节点具有相同的值,用于&#39; WileyProductCategory&#39;和&#39; FullfilmentType&#39;。 我的要求是删除所有此类重复标记,并仅保留其中一个重复标记。

请帮助。 Niharika

1 个答案:

答案 0 :(得分:0)

您可以通过标准&#34; Muenchian分组&#34;的变化来解决这个问题。技术 - 定义一个,它将Input个共享相同子值的元素组合在一起

<xsl:key name="inputGroup" match="Input"
   use="concat(WileyProductCategory, '|', FullfilmentType)" />

然后给定一个特定的类别/类型对,您可以使用

确定文档中具有此键值的第一个元素
key('inputGroup', concat(WileyProductCategory, '|', FullfilmentType))[1]

为了将它们联系在一起,我们从一个&#34;身份&#34;开始。转换(将输入复制到输出,除非使用更具体的模板覆盖它),然后添加模板以忽略除每个组中的第一个元素之外的所有元素。

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

  <xsl:key name="inputGroup" match="Input"
     use="concat(WileyProductCategory, '|', FullfilmentType)" />

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

  <!-- ignore second and subsequent elements in each key group -->
  <xsl:template match="Input[generate-id() != generate-id(key('inputGroup',
          concat(WileyProductCategory, '|', FullfilmentType))[1])]" />

</xsl:stylesheet>

此处generate-id()是模板尝试匹配的Input元素的唯一标识符,generate-id(key(....)[1])是文档中与同一个键匹配的第一个元素的唯一标识符值。