我提到了我的一个老线程,因为我遇到了类似的问题: 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>
你能帮我解决一下吗?谢谢。
最好的记录, 彼得
答案 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>