2011-06-21 17 views
2

クライアント側でxslt 1.0のコンマ区切り文字列を分割する必要があります。そのようなことは可能ですか? xslt clientsideで文字列を分割する

は、私はそれが再帰を検出したと言ってFirefoxの上のエラーを持って、それはそこに停止し

Stackoverflow Solution

のような方法を試してみました。私の問題は、SQLサーバーからXMLとしてデータを返すことであり、1対多の関係、1つのblogpostレコードに複数の "タグ" [ie #cars]があります。だから私はXMLタグの中にカンマ区切りのフィールドとして "タグ"を追加し、私はクライアント側でそれを再び分割したいと思います。あまりにも

を働くだろうSQL ServerのXMLから、ネストされたフィールドリストを作成するためのいくつかの方法がある場合は代わりすなわち代わりに「赤い車、2010年」の私はMSを使用しています

<tags> 
    <tag>cars</tag> 
    <tag>red</tag> 
    <tag>2010</tag> 
</tags> 

を返すことができますSQL Server 2008、ASP.NET 4.0、およびXSLT 1.0がブラウザに表示されるので、それらは私にとって利用可能なツールです。前もって感謝します!

+1

XSLT 1.0で文字列を解析し、その結果をノードとして操作するには、[EXSLT](http://exslt.org)が必要です。 **クライアント側のXSLTの限界を延ばすことは避けてください。その代わりに、MSSQLの機能を利用して、クライアントがXMLを簡単に処理できるようにXMLを作ります。確かに可能ですが、あなたのテーブルとデータがどのようなものかを示すものではありませんので、ここには示唆はありません。 – Lumi

+1

クライアント側で区切られた文字列を分割すると判断された場合は、XSLTの代わりにjavascriptを試してみてください。http://www.exslt.org/str/functions/tokenize/str.tokenize.js – LarsH

+1

変換を実行しないでくださいブラウザの内蔵プロセッサを使用します。 –

答えて

3

人々は、あなたがこの世代を遅らせると判断されたがあれば、ここでのXSLT 2.0はできる(XSLT1.0を使用して、クライアント上でこれを行う方法で、XMLは、サーバー側で発生させることができる権利です)だけでXPath 2.0の標準機能tokenize()を使用しますが、XSLT 2.0は、直接、今日のブラウザでサポートされていません。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <tags> 
    <xsl:apply-templates/> 
    </tags> 
</xsl:template> 

<xsl:template match="text()" name="split"> 
    <xsl:param name="pText" select="."/> 
    <xsl:param name="pDelim" select="', '"/> 
    <xsl:param name="pTagName" select="'tag'"/> 

    <xsl:if test="string-length($pText) >0"> 
     <xsl:element name="{$pTagName}"> 
     <xsl:value-of select= 
     "substring-before(concat($pText, $pDelim), $pDelim)"/> 
     </xsl:element> 

     <xsl:call-template name="split"> 
     <xsl:with-param name="pText" select= 
     "substring-after($pText, $pDelim)"/> 
     <xsl:with-param name="pDelim" select="$pDelim"/> 
     <xsl:with-param name="pTagName" select="$pTagName"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

この変換はに先頭の要素に包まれた次のXML文書(自分の指定した文字列に適用されるときそれを整形式にするこれは、XSLTで処理できるように、XMLドキュメント、):

<t>cars, red, 2010</t> 

指名手配、正しい結果が生成されます。このソリューションの汎用性 - :

<tags> 
    <tag>cars</tag> 
    <tag>red</tag> 
    <tag>2010</tag> 
</tags> 

ノートを実行します。テキストの場合、区切り文字列と "タグ名"はすべてパラメータとして指定されます。

0

データをXML (つまり、HTMLをカンマ区切りのリストに分割しない)として保存した場合は、を直接使用することができます。

declare @data as XML 

set @data = '<tags>' 
      + '<tag>cars</tag>' 
      + '<tag>red</tag>' 
      + '<tag>2010</tag>' 
      + '</tags>' 

SELECT tag.value('text()[1]', 'varchar(50)') as 'tags' 
FROM @data.nodes('/tags/tag') AS tags(tag)