按节点分组或删除用xslt重复的节点?

时间:2013-10-15 10:04:21

标签: xml xslt delete-row

我一直在研究如何删除重复的节点,而不是如何继续。

我有这个初始列表

<?xml version="1.0" encoding="utf-8"?>
<SEC count="7">
    <value>outy</value>
    <name>object</name>
    <Row>
<client>0000000530708</client>
        <date>20100401</date>
    </Row>
    <Row>
        <client>0000000530708</client>
        <date>20100401</date>
    </Row>
    <Row>
        <client>0000000999999</client>
        <date>20100401</date>
    </Row>
    <Row>
        <client>0000000999999</client>
        <date>20100401</date>
    </Row>
    <Row>
        <client>0000000999999</client>
        <date>20100401</date>
    </Row>
</SEC>

我希望得到这个

<?xml version="1.0" encoding="utf-8"?>
<SEC count="7">
    <value>outy</value>
    <name>object</name>
    <Row>
        <client>0000000530708</client>
        <date>20100401</date>
    </Row>
    <Row>
        <client>0000000999999</client>
        <date>20100401</date>
    </Row>
</SEC>

我该怎么办? 有人可以帮帮我吗?我使用XSL 1.0。

感谢。

1 个答案:

答案 0 :(得分:3)

您可以使用Muenchian方法的变体来实现此目的。从身份模板开始,按原样复制所有内容,除非被更具体的模板覆盖:

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

定义,给出唯一性条件:

<xsl:key name="uniqueRow" match="Row" use="concat(client, '|', date)"/>

并添加一个模板,以忽略的任何Row第一个具有该特定键值的模板:

<xsl:template match="Row[generate-id() !=
  generate-id(key('uniqueRow', concat(client, '|', date))[1])]"/>