2014-11-04 90 views
0

我称为我的一个老的线程重命名相同的内容重复的元素,因为我有类似的问题,以这样一种: XSLT 1.0: rename elements with same contentXSLT 1.0:使用计数器

我有下面的XML源。在每个Item元素中,我有孩子可能具有相同的值,例如在第3个Item我有两个孩子的值为“ZA南非”和“SPAR WC”。 这些我必须用一个后缀“make unique”,例如一个计数器号码。

这是源:

<?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> 

但我期待这个输出 - 请注意第三个元素。我只希望 内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> 

能否请你帮我出。谢谢。

最佳regarsd, 彼得

回答

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> 
+0

谢谢Rudramuni,它工作得很好。我只添加了“”检查空元素。对于清空逻辑不能应用。祝好, – Peter 2014-11-05 07:59:27

+0

欢迎彼得,不错的逻辑代码u编码,现在它将是一个完整的。我编辑了我的答案。 – 2014-11-05 09:30:31