xml - 在 XML 中查找重复值并在 XSL 中删除节点
问题描述
我在找出元素的重复值并删除节点时遇到问题。
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>
<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>
推荐阅读
- sql - SQL - 特定名称字段的响应时间计数范围
- java - What does the statement Object[][] data = new Object [][] mean?
- sql - Physical Pkey in Fact table
- github - 当我使用 git add 'sampleFile.txt' 时,Git 给了我'Permission Denied'
- java - 获取2个字符串的重复值并计算它们
- haskell - 在 Haskell 中执行断言
- html - 在 Blogger 中从正文中删除背景
- javascript - 如何编写脚本以更改嵌套手风琴中的“+”、“-”符号?
- javascript - Vue:使用 VueJS 不会触发 Twitch 播放器事件?
- expo - AWS Amplify `configure` 没有选项