xml - 排除重复节点的上次出现 重复节点是具有相同值的多个属性的节点

  显示原文与译文双语对照的内容
0 0

我一直试图为我的检测和消除重复节点编写一个 xpath/xslt 。 在我的例子中,重复节点是具有相同值的多个属性的节点。 消除重复的方法是排除重复节点的最后一次出现。 如果有其它方法,请咨询。

请注意:重复节点= 具有相同 operator1,operator2和operator3属性值的节点。

xml:

<data id ="root">
 <record id="1" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="2" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="3" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="4" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="5" operator1='xxx' operator2='lkj' operator3='tyu'/>
 <record id="6" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="7" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="8" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="9" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="10" operator1='rrr' operator2='yyy' operator3='zzz'/>
</data>

我需要的输出:

<data id ="root">
 <record id="1" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="2" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="3" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="4" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="6" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="7" operator1='abc' operator2='yyy' operator3='zzz'/>
</data>

我最近来的是使用这个 Xpath,但它不能完全正常工作。

"//record[(./@operator1 = following-sibling::record/@operator1) and (./@operator2 = following-sibling::record/@operator2) and (./@operator3 = following-sibling::record/@operator3)]".

我搜索了整个互联网,但没有任何运气。 任何帮助都非常有用。 非常感谢。

时间:原作者:4个回答

0 0

我一直试图为我的检测和消除重复节点编写一个 xpath/xslt 。 在我的例子中,重复节点是具有相同值的多个属性的节点。 消除重复的方法是排除重复节点的最后一次出现。 如果有其它方法,请咨询。

请注意:重复节点= 具有相同 operator1,operator2和operator3属性值的节点。

这是重复节点消除的冲突定义。

如果删除重复的重复序列的最后一个序列,则不会删除重复节点。 你想要的结果:

<data id ="root">
 <record id="1" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="2" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="3" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="4" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="6" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="7" operator1='abc' operator2='yyy' operator3='zzz'/>
</data>

仍然包含诸如id和( 2,3,和 7 )的重复的重复项

正确的重复重复duplicates也称为重复删除 deduplication,要求只保留所有重复项目的一个条目,。 通常在 XSLT 1.0中通过使用Muenchian方法进行分组来完成以下操作:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:key name="kRecByAtts" match="record"
 use="concat(@operator1,'***',
 @operator2,'***',
 @operator3)"/>
 <xsl:template match="node()|@*">
 <xsl:copy>
 <xsl:apply-templates select="node()|@*"/>
 </xsl:copy>
 </xsl:template>
 <xsl:template match=
"record
 [not(generate-id()
 =
 generate-id(key('kRecByAtts',
 concat(@operator1,'***',
 @operator2,'***',
 @operator3)
 )[1]
 )
 )
 ]
"/>
</xsl:stylesheet>

在所提供的XML文档上应用这里转换时,会发生以下情况:

<data id ="root">
 <record id="1" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="2" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="3" operator1='abc' operator2='yyy' operator3='zzz'/>
 <record id="4" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="6" operator1='xxx' operator2='yyy' operator3='zzz'/>
 <record id="7" operator1='abc' operator2='yyy' operator3='zzz'/>
</data>

所需的,正确结果将生成:

<data id="root">
 <record id="1" operator1="xxx" operator2="yyy" operator3="zzz"/>
 <record id="2" operator1="abc" operator2="yyy" operator3="zzz"/>
</data>
原作者:
0 0

下面是一个 XSLT 1.0样式表的示例,它消除了最后一个重复的'唱片'元素:

<xsl:stylesheet 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 version="1.0">
 <xsl:key name="k1" match="record" 
 use="concat(@operator1, '|', @operator2, '|', @operator3)"/>
 <xsl:template match="@* | node()">
 <xsl:copy>
 <xsl:apply-templates select="@* | node()"/>
 </xsl:copy>
 </xsl:template>
 <xsl:template match="record[generate-id() 
 = 
 generate-id(key('k1', 
 concat(@operator1, '|', 
 @operator2, '|', 
 @operator3))[last()])]"/>
</xsl:stylesheet>
原作者:
...