查找具有重复ID的节点并更改ID

时间:2014-01-22 09:47:05

标签: xslt xpath duplicate-data

我需要找到重复的节点(由ID标识),如果存在这样的节点,那么我需要更新其中一个节点的id。如果有人可以让我知道如何根据xpath或xsl进行操作,我们将不胜感激。

示例xml:

<music>
    <title id="1"/>
    <title id="2"/>
    <title id="1"/>
</music>

第一个和第三个节点具有相同的ID。所以,第三个的id改为'3'。我需要将其更改为以下内容:

<music>
  <title id="1"/>
  <title id="2"/>
  <title id="3"/>
</music>

2 个答案:

答案 0 :(得分:0)

请尝试以下模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="music">
        <xsl:copy>
            <xsl:for-each select="*">
                <xsl:element name="{name()}">
                    <xsl:attribute name="id">
                        <xsl:choose>
                            <xsl:when test="preceding::*/@id=current()/@id">
                                <xsl:value-of select="generate-id()"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="@id"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:attribute>
                    <xsl:apply-templates/>
                </xsl:element>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

通常,ID的目的是唯一地标识元素。如果是这样,那么实际的ID字符串是无关紧要的 - 只要没有重复项。

因此,解决问题的最简单方法是对所有title元素进行一致编号,正如@ michael.hor257k所述。这可以使用position()xsl:number完成。

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/music">
      <xsl:copy>
         <xsl:apply-templates/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="title">
      <xsl:copy>
         <xsl:attribute name="id">
            <xsl:number/>
         </xsl:attribute>
      </xsl:copy>
   </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<music>
    <title id="1"/>
    <title id="2"/>
    <title id="3"/>
</music>