我有一个值列表,需要能够检查是否存在重复,如果存在,我需要添加" 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。任何帮助将不胜感激。
答案 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
都需要遍历其前面的所有兄弟姐妹。