2017-01-17 13 views
0

XSLTを使用して単一ノードから重複した値を除外する必要があります。xsltを使用して単一のxmlノードから重複した値を除外する方法

ex。

<?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で実行しようとしている場合は、xsl: how to split strings?のような処理を行うことができます。また、プロセッサがその結果をドキュメントにロードしてからサポートする場合はdocument()関数を使用します別の結果を得るには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()機能もサポートされる可能性があります。私にとっては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の提案は、心配することなく、 ''に短縮できます最後に余分なコンマ –

関連する問題