【问题标题】:Find duplicate values in XML and remove the node in XSL在 XML 中查找重复值并在 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>

我想将 &lt;name&gt;Learn XSLT&lt;/name&gt;&lt;id&gt;2&lt;/id&gt; 的重复条目存储在变量中,并从 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

标签: xml parsing xslt nodes


【解决方案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>

【讨论】:

  • 但我可能有很多重复项,而不仅仅是一个。我不能把所有东西都放在参数里?
  • 如果您在问题中包含这些详细信息会很有帮助,但找出答案的最简单方法是尝试一下。
  • 就像我需要删除 Learn XSLT2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多