2015-07-20 59 views
0

我有一個值列表,需要能夠檢查是否存在重複,如果是這樣,我需要在第一個重複後添加一個「1」,一個「2」後第二次重複。XSLT 1.0 - 添加一個特定的序列號到一個重複的值

我的XML看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<data xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" language="nl_NL" timezone="Europe/Paris"> 
<Declaration wayBillNumber="102956715"/> 
<Declaration wayBillNumber="102956715"/> 
<Declaration wayBillNumber="151975168"/> 
<Declaration wayBillNumber="152003915"/> 
<Declaration wayBillNumber="152005173"/> 
<Declaration wayBillNumber="152005964"/> 
<Declaration wayBillNumber="152011491"/> 
<Declaration wayBillNumber="152011491"/> 
<Declaration wayBillNumber="183875206"/> 
<Declaration wayBillNumber="204305618"/> 
<Declaration wayBillNumber="152011491"/> 
<Declaration wayBillNumber="210642574"/> 
</data> 

輸出應該是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<data xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" language="nl_NL" timezone="Europe/Paris"> 
<Declaration wayBillNumber="102956715"/> 
<Declaration wayBillNumber="102956715-1"/> 
<Declaration wayBillNumber="151975168"/> 
<Declaration wayBillNumber="152003915-2"/> 
<Declaration wayBillNumber="152005173"/> 
<Declaration wayBillNumber="152005964"/> 
<Declaration wayBillNumber="152011491"/> 
<Declaration wayBillNumber="152011491-1"/> 
<Declaration wayBillNumber="183875206"/> 
<Declaration wayBillNumber="204305618"/> 
<Declaration wayBillNumber="152011491-2"/> 
<Declaration wayBillNumber="210642574"/> 
</data> 

我看到,如果出現重複和然後用它做點什麼,但我似乎無法找到的是如何添加序列號它。當我使用下面的行時,每個重複值後面只加「-1」。

<xsl:attribute name="wayBillNumber"> 
<xsl:choose> 
<xsl:when test="preceding::*/Declaration/@wayBillNumber=current()/Declaration/@wayBillNumber"><xsl:value-of select="Declaration/@wayBillNumber"/>-<xsl:value-of select="count((.|preceding-sibling::Declaration/@wayBillNumber)[not(Declaration/@wayBillNumber = preceding-sibling::Declaration/@wayBillNumber)])"/></xsl:when> 
<xsl:otherwise><xsl:value-of select="Declaration/@wayBillNumber"/></xsl:otherwise> 
</xsl:choose> 
</xsl:attribute> 

我只能使用XSLT 1.0。任何幫助,將不勝感激。

+0

輸出的順序是否重要?如果沒有,我建議你做[適當的分組](http://www.jenitennison.com/xslt/grouping/muenchian.html),然後使用'position()'函數爲每個組中的項目編號。 –

+0

P.S.這個要求有一些非常「錯誤的」:如果'wayBillNumber'值很重要,那麼你不應該修改它們。相反,您應該向「聲明」中添加其他屬性,並使用整體唯一值填充它 - 而不考慮「wayBillNumber」序列。 OTOH,如果'wayBillNumber'的值可以被修改,那麼爲什麼不簡單地爲它們的所有**添加一個整體唯一值呢? –

+0

是的,我知道這一點。只是爲它們添加一個獨特的值將是最好的解決方案,但接收系統不會爲此改變它的數據模型,所以我只需做出正確的決定。 –

回答

2

作爲速戰速決,你可以嘗試這樣的:

<xsl:template match="Declaration"> 
    <xsl:variable name="i" select="count(preceding-sibling::Declaration[@wayBillNumber=current()/@wayBillNumber])" /> 
    <xsl:copy> 
     <xsl:attribute name="wayBillNumber"> 
      <xsl:value-of select="@wayBillNumber"/> 
      <xsl:if test="$i"> 
       <xsl:value-of select="concat('-', $i)"/> 
      </xsl:if> 
     </xsl:attribute> 
    </xsl:copy> 
</xsl:template> 

然而,這是一個非常低效的方法,因爲每個Declaration需要去在其所有前兄弟姐妹。

+0

不錯的代碼來檢查重複的值,加上一個。 –

+0

的確很不錯。我正在使用這個。謝謝邁克爾! –

相關問題