XSLT 1.0 - 将特定序列号添加到重复值

时间:2015-07-20 11:36:12

标签: xml xslt

我有一个值列表,需要能够检查是否存在重复,如果存在,我需要添加" 1"在第一次重复之后,a" 2"在第二次重复之后。

我的XML看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" language="nl_NL" timezone="Europe/Paris">
<Declaration wayBillNumber="102956715"/>
<Declaration wayBillNumber="102956715"/>
<Declaration wayBillNumber="151975168"/>
<Declaration wayBillNumber="152003915"/>
<Declaration wayBillNumber="152005173"/>
<Declaration wayBillNumber="152005964"/>
<Declaration wayBillNumber="152011491"/>
<Declaration wayBillNumber="152011491"/>
<Declaration wayBillNumber="183875206"/>
<Declaration wayBillNumber="204305618"/>
<Declaration wayBillNumber="152011491"/>
<Declaration wayBillNumber="210642574"/>
</data>

输出应该是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" language="nl_NL" timezone="Europe/Paris">
<Declaration wayBillNumber="102956715"/>
<Declaration wayBillNumber="102956715-1"/>
<Declaration wayBillNumber="151975168"/>
<Declaration wayBillNumber="152003915-2"/>
<Declaration wayBillNumber="152005173"/>
<Declaration wayBillNumber="152005964"/>
<Declaration wayBillNumber="152011491"/>
<Declaration wayBillNumber="152011491-1"/>
<Declaration wayBillNumber="183875206"/>
<Declaration wayBillNumber="204305618"/>
<Declaration wayBillNumber="152011491-2"/>
<Declaration wayBillNumber="210642574"/>
</data>

我能够看到是否发生了重复,然后对其进行了一些操作,但我似乎无法找到的是如何添加序列号。当我使用下面的行时,只有&#34; -1&#34;在每个重复值之后添加。

<xsl:attribute name="wayBillNumber">
<xsl:choose>
<xsl:when test="preceding::*/Declaration/@wayBillNumber=current()/Declaration/@wayBillNumber"><xsl:value-of select="Declaration/@wayBillNumber"/>-<xsl:value-of select="count((.|preceding-sibling::Declaration/@wayBillNumber)[not(Declaration/@wayBillNumber = preceding-sibling::Declaration/@wayBillNumber)])"/></xsl:when>
<xsl:otherwise><xsl:value-of select="Declaration/@wayBillNumber"/></xsl:otherwise>
</xsl:choose>
</xsl:attribute>

我只能使用XSLT 1.0。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

作为快速解决方案,您可以尝试以下方式:

<xsl:template match="Declaration">
    <xsl:variable name="i" select="count(preceding-sibling::Declaration[@wayBillNumber=current()/@wayBillNumber])" />
    <xsl:copy>
        <xsl:attribute name="wayBillNumber">
            <xsl:value-of select="@wayBillNumber"/>
            <xsl:if test="$i">
                <xsl:value-of select="concat('-', $i)"/>
            </xsl:if>
        </xsl:attribute>
    </xsl:copy>
</xsl:template>

然而,这是一种非常低效的方法,因为每个Declaration都需要遍历其前面的所有兄弟姐妹。