2014-01-22 71 views
0

我需要查找重複的節點(由ID標識),如果存在此類節點,則需要更新其中一個節點的ID。如果有人能夠根據xpath或xsl讓我知道如何去做,我會很感激。查找帶有重複ID的節點並更改ID

示例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

* 「第一和第三節點具有相同的ID。因此第三的id被改變爲 '3'。」 *除非有已經*是*的節點ID = 3,在這種情況下,您需要升到ID = 4。但是您可能已經在以前的副本中使用了ID = 4,因此您建議的方式比看起來複雜得多。用連續數字對所有*節點重新編號會不會更簡單? –

回答

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

這並不能保證未使用的ID被輸出,因爲可能已經存在一個ID,該ID等於給定標題元素的'position()'。 –

+0

是的,我同意。我會找到另一種方法,並儘快編輯我的答案。 –

+0

謝謝,ID實際上是一個獨特的值,如'a3dvb3'不是序列號。將很感激,如果你可以得到一種方式來創建唯一的ID。 – user1749707

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>