2017-01-17 58 views
0

我必須使用XSLT從單個節點中排除重複值如何使用xslt從單個xml節點中排除重複的值

前。

<?xml version="1.0" encoding="UTF-8" ?> 
<base> 
<string>test1,test2,test3,test1,test4,test2,test5,</string> 
</base> 

結果應該是這樣的:

<?xml version="1.0" encoding="UTF-8" ?> 
<base> 
string>test1,test2,test3,test4,test5,</string> 
</base> 

誰能幫我這個好嗎?

+1

什麼版本的XSLT/XSLT引擎? –

+0

問題應根據需要使用xslt-1.0,xslt-2.0或xslt-3.0標記之一。 – Nolwennig

回答

0

如果你想做到這一點在XSLT 1.0,您應該能夠使用document()功能,這樣做xsl: how to split strings?,也許,如果它是由您的處理器支持到的,結果加載到一個文檔,然後也許可以使用xsl:key來獲得明顯的結果。雖然這是相當複雜的。以下是另一種避免使用純XSLT 1.0進行卷積的方法:https://stackoverflow.com/a/34944992/3016153

我的偏好仍然是某種延伸,如果你正在做這個使用MSXML,你可以做類似如下(我可能會喜歡這裏的C#,但如果你不使用MSXML的JavaScript可能是更便攜):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://mycompany.com/mynamespace"> 
    <xsl:template match="/base/string"> 
    <xsl:value-of select="user:distinctSplit(string(.))" /> 
    </xsl:template> 
    <msxsl:script language="JScript" implements-prefix="user"> 

    function distinctSplit(str) { 
     var u = {}, a = []; 
     var splt = str.split(','); 
     for(var i = 0;i &lt; splt.length;i++) { 
     if (u.hasOwnProperty(splt[i])) { 
      continue; 
     } 
     a.push(splt[i]); 
     u[splt[i]] = 1; 
     } 

     return a.join(','); 
    } 
</msxsl:script> 
</xsl:stylesheet> 

如果」不使用MSXML,你可能會得到一個tokenize擴展或者使用你的處理器嵌入JavaScript的方法(並且你的處理器甚至可能支持.filter()函數的數組,這可能使代碼更簡單 - 使用MSXML在本地測試不支持filter())。

如果您使用XSLT 2.0,你可以使用tokenizedistinct-values,這樣的事情應該工作:

<xsl:for-each select="distinct-values(tokenize(/base/string, ','))" separator=","> 
    <xsl:value-of select="concat(., ',')" /> 
</xsl:for-each> 

,但你可能有它扮演一個小可以添加額外的,文字說最後你不想要。

+0

對於XSLT 2.0,它工作得很好,謝謝!在XSLT 1.0中以某種方式執行它也是可能的嗎? –

+0

我的答案的第一部分是針對XSLT 1.0 - 但沒有簡單/直接的方法來做到這一點,而不需要擴展。我開始玩它,雖然我確信它有點可能我不認爲它會很漂亮。如果您發現答案有用,請考慮將其提升並將其標記爲未來用戶接受的答案。 –

+1

XSLT 2.0建議可以縮短爲'',而不必擔心最後的額外逗號。 –

相關問題