首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >查找XML中的重复值并移除XSL中的节点

查找XML中的重复值并移除XSL中的节点
EN

Stack Overflow用户
提问于 2018-09-13 07:03:48
回答 1查看 816关注 0票数 1

我在查找元素的重复值并删除节点时遇到问题。

XML:

代码语言:javascript
复制
<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节点。我被困在如何找到那些重复的东西上。

预期的输出变量包含

代码语言:javascript
复制
<books>
    <name>Learn XSLT</name>
    <id>2</id>
    </books>

输出XML

代码语言:javascript
复制
<library>
    <books>
    <name>Learn XSLT</name>
    <id>1</id>
    </books>
    <books>
    <name>Learn Java</name>
    <id>3</id>
    </books>
    </library>
EN

回答 1

Stack Overflow用户

发布于 2018-09-13 09:39:55

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

使用带有专用模板的identity transform来匹配要删除的元素:

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52304563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档