【问题标题】:Need to omit/remove duplicate nodes in XSLT 1.0需要在 XSLT 1.0 中省略/删除重复节点
【发布时间】:2018-12-18 18:28:48
【问题描述】:

任何人都可以帮助我使用 XSLT 1.0 从 XML 标记中省略重复项。

我是 XSLT 的新手,非常感谢任何帮助。

输入

<JdeVariable>
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
</JdeVariable>

预期输出:

<JdeVariable>
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
</JdeVariable>

【问题讨论】:

  • 在 SO 上尝试Muenchian grouping。你会发现很多解决这个问题的例子。
  • @aniket V. 你能帮帮我吗

标签: xml xslt xpath


【解决方案1】:

由于您坚持使用 XSLT 1.0,因此需要使用 muenchian grouping 来消除重复节点。

使用如下定义xsl:key

<xsl:key name="key-val" match="ns0:JDE" use="ns0:JdeNumber" />

匹配模板以仅过滤唯一节点

<xsl:template match="ns0:JDE[generate-id() = generate-id(key('key-val', ns0:JdeNumber))]">
    <xsl:copy>
        <xsl:apply-templates select="node()" />
    </xsl:copy>
</xsl:template>

完整的XSLT代码如下(方法参考cmets)

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

    <xsl:key name="key-val" match="ns0:JDE" use="ns0:JdeNumber" />

    <!-- identity transform template to copy input as is to output -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="ns0:JDE[generate-id() = generate-id(key('key-val', ns0:JdeNumber))]">
        <xsl:copy>
            <xsl:apply-templates select="node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="ns0:JDE" />
</xsl:stylesheet>

输出

<JdeVariable xmlns:ns0="http://someurl">
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
</JdeVariable>

【讨论】:

  • HI@aniket 我能够修改问题,请您帮帮我。我真的很感谢你的帮助。提前谢谢..!
  • 我已根据输入 XML 的更改更新了解决方案。请确保您在 XSL 中使用由 ns0 标识的正确命名空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
相关资源
最近更新 更多