gpt4 book ai didi

xml - 使用 XSLT 删除连续的重复项

转载 作者:数据小太阳 更新时间:2023-10-29 02:58:42 24 4
gpt4 key购买 nike

我有一些 XML,我想在其中删除相同的连续子节点,这些子节点位于不同的父节点中。也就是说,如果一个子节点(在不同的父节点中)我的 XML 树连续出现两次或更多次,我想删除所有重复项。

我想到的重复节点是 <child>a</child>在前两个<parent>节点。

一个例子:

这是源 XML:

<root>
<parent>
<child>a</child>
<child>b</child>
<child>c</child>
</parent>

<parent>
<child>a</child>
<child>bb</child>
<child>cc</child>
</parent>

<parent>
<child>aaa</child>
<child>bbb</child>
<child>ccc</child>
</parent>

<parent>
<child>a</child>
<child>bbbb</child>
<child>cccc</child>
</parent>

</root>

这是所需的 XML:

<root>
<parent>
<child>a</child>
<child>b</child>
<child>c</child>
</parent>

<parent>
<child>bb</child>
<child>cc</child>
</parent>

<parent>
<child>aaa</child>
<child>bbb</child>
<child>ccc</child>
</parent>

<parent>
<child>a</child>
<child>bbbb</child>
<child>cccc</child>
</parent>

</root>

只删除一个元素,但如果有,例如,连续 5 个 <child>a</child>开头的节点(而不是 2 个),其中四个将被删除。我正在使用 XSLT 2.0。

我很感激任何帮助。

跟进:

感谢 Kirill,我得到了我想要的文档,但是如果我有这样的 XML 文档,这会产生一个我没有预料到的新问题:

<root>
<parent>
<child>a</child>
<child>b</child>
<child>c</child>
</parent>

<parent>
<child>a</child>
<child>b</child>
<child>c</child>
</parent>

<parent>
<child>aaa</child>
<child>bbb</child>
<child>ccc</child>
</parent>

</root>

我应用了 Kirill 的 XSLT,我明白了:

<root>
<parent>
<child>a</child>
<child>b</child>
<child>c</child>
</parent>

<parent>
</parent>

<parent>
<child>aaa</child>
<child>bbb</child>
<child>ccc</child>
</parent>

</root>

我怎样才能同时删除 <parent> </parent> ?对于我的应用程序,可能还有 <parent> 的其他子元素。 , 如果没有 <child> 则可以删除<parent> 中的元素元素。

我有一个我不喜欢的解决方案是在第一个转换之后应用另一个转换。这仅在按顺序应用时有效,我需要一个单独的 XSLT 文件并且需要运行两个命令而不是一个。

这里是:

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

<xsl:template match="parent[not(child)]"/>

最佳答案

使用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="child[../preceding-sibling::parent[1]/child = .]"/>

</xsl:stylesheet>

关于xml - 使用 XSLT 删除连续的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com