XSLT 1.0:使用counter重命名具有相同内容的重复元素

时间:2014-11-04 16:11:42

标签: xml xslt

我提到了我的一个老线程,因为我遇到了类似的问题: XSLT 1.0: rename elements with same content

我有以下XML源代码。在每个Item元素中,我有孩子可以具有相同的值,例如在第3 Item我有两个有价值观的孩子" ZA SOUTH AFRICA"和" SPAR WC"。 这些我必须做出独特的"带后缀,例如计数器编号。

这是来源:

<?xml version="1.0" encoding="UTF-8"?>
<EntityGroup>
<Item>
    <ENTITY_GROUP_CODE>0000004644</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>CHECKERS</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>OK KZN</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5/>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000004612</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5/>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000056016</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5>SPAR WC</ENTITY_GROUP_LEVEL5>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000056020</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5>SUPERSPAR WC</ENTITY_GROUP_LEVEL5>
</Item>
</EntityGroup>

我想出了这个XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output encoding="UTF-8" method="xml" indent="yes"/>

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

<xsl:template match="Item">
    <Item>
        <xsl:apply-templates select="@*|node()">
            <xsl:with-param name="number">
                <xsl:number/>
            </xsl:with-param>
        </xsl:apply-templates>
    </Item>
</xsl:template>

<xsl:template match="Item/child::*">
    <xsl:param name="number"/>
    <xsl:element name="{local-name()}">
        <xsl:value-of select="concat(.,'-',count(preceding-sibling::*[. = current()]))"/>   
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

它给出了这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<EntityGroup>
<Item>
    <ENTITY_GROUP_CODE>0000004644-0</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA-0</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY-0</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>CHECKERS-0</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>OK KZN-0</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5>-0</ENTITY_GROUP_LEVEL5>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000004612-0</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA-0</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY-0</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR-0</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC-0</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5>-0</ENTITY_GROUP_LEVEL5>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000056016-0</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA-0</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA SOUTH AFRICA-1</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR-0</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC-0</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5>SPAR WC-1</ENTITY_GROUP_LEVEL5>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000056020-0</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA-0</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY-0</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR-0</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC-0</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5>SUPERSPAR WC-0</ENTITY_GROUP_LEVEL5>
</Item>
</EntityGroup>

但是我期待这个输出 - 请注意第3个Item元素。我只是 希望Item元素中的重复值带有后缀:

<?xml version="1.0" encoding="UTF-8"?>
<EntityGroup>
<Item>
    <ENTITY_GROUP_CODE>0000004644</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>CHECKERS</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>OK KZN</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5/>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000004612</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5/>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000056016</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA SOUTH AFRICA-1</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5>SPAR WC-1</ENTITY_GROUP_LEVEL5>
</Item>
<Item>
    <ENTITY_GROUP_CODE>0000056020</ENTITY_GROUP_CODE>
    <ENTITY_GROUP_LEVEL1>ZA SOUTH AFRICA</ENTITY_GROUP_LEVEL1>
    <ENTITY_GROUP_LEVEL2>ZA GROCERY</ENTITY_GROUP_LEVEL2>
    <ENTITY_GROUP_LEVEL3>SPAR</ENTITY_GROUP_LEVEL3>
    <ENTITY_GROUP_LEVEL4>SPAR WC</ENTITY_GROUP_LEVEL4>
    <ENTITY_GROUP_LEVEL5>SUPERSPAR WC</ENTITY_GROUP_LEVEL5>
</Item>
</EntityGroup>
你能帮我解决一下吗?谢谢。

最好的记录, 彼得

1 个答案:

答案 0 :(得分:0)

几乎你接近结果,只需按照给出的改变:

<xsl:template match="Item/child::*">
<xsl:choose>
    <xsl:when test="preceding-sibling::*[. = current()] and not(current()='')">
        <xsl:element name="{local-name()}">
            <xsl:value-of select="concat(.,'-',count(preceding-sibling::*[. = current()]))"/>   
        </xsl:element>
    </xsl:when>
        <xsl:otherwise>
            <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
        </xsl:otherwise>
</xsl:choose>
</xsl:template>
相关问题