如何重新映射xml,以便仅显示节点中的重复值

时间:2019-04-18 11:24:57

标签: xml xslt

我具有以下xml结构:

<?xml version="1.0" encoding="UTF-8"?>
<nodes>
<Node>
    <a>xxx</a>
    <b>adad</b>
    <c>yyy</c>
    <d>ddwr</d>
    <e>awe</e>
</Node>
<Node>
    <a>xxx</a>
    <b>adaddad</b>
    <c>yyy</c>
    <d>kodoska</d>
    <e>lkadkda</e>
</Node>
<Node>
    <a>xxx</a>
    <b>adase</b>
    <c>yyy</c>
    <d>kodoa.smdkadska</d>
    <e>lkadddadaadsasdkda</e>
</Node>
</nodes>

我想用xslt进行映射,以便仅显示具有相同值的节点的节点。所以我期望这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<Node>
<a>xxx</a>
<c>yyy</c>
</Node>

2 个答案:

答案 0 :(得分:0)

假设结构规则(所有@SpringBootTest元素都具有相同的子节点),则可以执行以下操作:

XSLT 1.0

Node

答案 1 :(得分:0)

您在这里做两件事:删除元素名称的重复数据,测试它们是否都具有相等的值。

此样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:key name="kElement-By-Name" match="Node/*" use="name()"/>
    <xsl:template match="nodes">
        <Node>
            <xsl:for-each 
              select="Node/*[
                generate-id()=generate-id(key('kElement-By-Name',name())[1])
              ]">
                <xsl:copy-of select="(.)[not(. != key('kElement-By-Name',name()))]"/>
            </xsl:for-each>
        </Node>
    </xsl:template>
</xsl:stylesheet>

输出

<Node>
  <a>xxx</a>
  <c>yyy</c>
</Node>

请注意:重复数据删除的分组,节点集比较是很重要的(因此,如果没有任何不同,则全部相同)