在XML中查找重复值并删除XSL中的节点?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (287)

我有问题找出元素的重复值并删除节点。

XML:

<library>
<books>
<name>Learn XSLT</name>
<id>1</id>
</books>
<books>
<name>Learn Java</name>
<id>3</id>
</books>
<books>
<name>Learn XSLT</name>
<id>2</id>
</books>
</library>

我想存储<name>Learn XSLT</name><id>2</id>变量中的重复条目,并从XML中删除该books节点。我被困在如何找到那些重复。

预期的输出变量包含

<books>
    <name>Learn XSLT</name>
    <id>2</id>
    </books>

输出XML

<library>
    <books>
    <name>Learn XSLT</name>
    <id>1</id>
    </books>
    <books>
    <name>Learn Java</name>
    <id>3</id>
    </books>
    </library>
提问于
用户回答回答于

如果您要xsl:param包含要查找的XML结构(或从某个地方选择它,例如外部文档),则可以xsl:param使用deep-equal()执行比较的方法删除其中所有子元素与元素的子元素匹配的元素。

使用带有专用模板的标识转换来匹配要删除的元素:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

  <xsl:output indent="yes"/>

  <xsl:param name="filter">
    <books>
        <name>Learn XSLT</name>
        <id>2</id>
    </books>
  </xsl:param>

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

  <!--if all of the matched element's children are deep equal to the $filter element's children, 
      then remove it -->
  <xsl:template match="*[deep-equal(*, $filter/*/*)]"/>

</xsl:stylesheet>

扫码关注云+社区

领取腾讯云代金券