在 XML 中查找重复值并在 XSL 中删除节点
Posted
技术标签:
【中文标题】在 XML 中查找重复值并在 XSL 中删除节点【英文标题】:Find duplicate values in XML and remove the node in XSL 【发布时间】:2019-02-17 15:34:39 【问题描述】:我在找出元素的重复值并删除节点时遇到问题。
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>
【问题讨论】:
你使用什么编程语言? 我正在使用 xslt 【参考方案1】:如果您有一个包含要查找的 XML 结构的 xsl:param
(或从某处选择它,例如外部文档),您可以删除其所有子元素与 xsl:param
元素的子元素匹配的元素, 使用deep-equal()
进行比较。
使用带有专用模板的identity transform 来匹配要删除的元素:
<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>
【讨论】:
但我可能有很多重复项,而不仅仅是一个。我不能把所有东西都放在参数里? 如果您在问题中包含这些详细信息会很有帮助,但找出答案的最简单方法是尝试一下。 就像我需要删除以上是关于在 XML 中查找重复值并在 XSL 中删除节点的主要内容,如果未能解决你的问题,请参考以下文章