XSL删除重复的元素不起作用(保留空父元素)

时间:2020-01-09 16:16:41

标签: xml xslt duplicates key

我有这个xml。

import pandas as pd

if __name__ == '__main__':
    sheet = pd.read_csv("labels.csv", header=None)
    sheet = sheet.append([[41, 42, 42, 44, 45]], ignore_index=True)

当另一个具有相同“ orderid”的节点存在时,我需要删除“消息”节点(重复检查)。 我正在使用此xsl。

<list>
<message ref="00001">
    <entry>
        <orderid>P001</orderid>
        <timestamp>20200109085816092</timestamp>
    </entry>
</message>
<message ref="00002">
    <entry>
        <orderid>P002</orderid>
        <timestamp>20200109085813556</timestamp>
    </entry>
</message>
<message ref="00003">
    <entry>
        <orderid>P003</orderid>
        <timestamp>20200109085814612</timestamp>
    </entry>
</message>
<message ref="00004">
    <entry>
        <orderid>P001</orderid>
        <timestamp>20010109085816092</timestamp>
    </entry>
</message>
<message ref="00005">
    <entry>
        <orderid>P002</orderid>
        <timestamp>20020109085813556</timestamp>
    </entry>
</message>
<message ref="00006">
    <entry>
        <orderid>P003</orderid>
        <timestamp>20030109085814612</timestamp>
    </entry>
</message>

但是输出包含不需要的“ message”标签(带有ref =“ 0004”,“ 0005”和“ 0006”)。

<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="kOrderId" match="entry" use="orderid"/>

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

<xsl:template match="entry[not(generate-id() = generate-id(key('kOrderId', orderid)[1]))]"/>

我需要从输出中删除这些多余的标签。 我该如何实现? 谢谢。

1 个答案:

答案 0 :(得分:1)

如果要删除重复的message元素,请使密钥和模板匹配message,而不是entry

<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="kOrderId" match="message" use="entry/orderid"/>

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

<xsl:template match="message[not(generate-id() = generate-id(key('kOrderId', entry/orderid)[1]))]"/>

</xsl:stylesheet>

请注意,这假设message包含一个entry

相关问题