2009-08-03 8 views
0

heirarchicalなグループ構造を持つアプリケーションがあります。グループの一部は、この形式で渡されます。XSLで文字列を展開する

/Geography/NA/US/California 

私は次のように設定されたノードを取得することができるように、この文字列を「アンロール」したいと思います:

/Geography 
/Geography/NA 
/Geography/NA/US 
/Geography/NA/US/California 

私は、私が使用することができます知っていますstr:tokenizeとノードセットを得るように:[Geography, NA, US, California]しかし、私は部品を段階的に組み立てる方法を失っています。

ほとんどのexslt関数を使用できますが、XSLT 2.0の機能はありません。

答えて

2

そうのようなこれはあなたが必要とするすべては再帰関数である、平野XSLT 1.0で非常に簡単です:'/Geography/NA/US/California'ため

<xsl:template name="UnrollString"> 
    <xsl:param name="string" select="''" /> 
    <xsl:param name="head" select="'/'" /> 

    <xsl:variable name="tail" select=" 
    concat(
     substring-after($string, $head), 
     '/' 
    ) 
    " /> 
    <xsl:variable name="lead" select=" 
    concat(
     $head, 
     substring-before($tail, '/') 
    ) 
    " /> 

    <xsl:if test="not($tail = '/')"> 
    <token> 
     <xsl:value-of select="$lead" /> 
    </token> 

    <xsl:call-template name="UnrollString"> 
     <xsl:with-param name="string" select="$string" /> 
     <xsl:with-param name="head" select="concat($lead, '/')" /> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

出力は次のとおりです。

<token>/Geography</token> 
<token>/Geography/NA</token> 
<token>/Geography/NA/US</token> 
<token>/Geography/NA/US/California</token> 

注こと:

  • この関数は、文字列が区切り文字(つまりスラッシュ)で始まるか、最初の単語( '地理')が欠落しているとみなします出力に表示されます。
  • 単一の末尾のスラッシュは無視されます。
  • 区切り文字は簡単に一般化され、パラメータとして渡されます。
  • 外部の代わりに<token>要素に再帰呼び出しを配置すると、簡単に階層を構築できます。
  • 再帰呼び出しを<token>要素の下ではなく上に置くことで、出力順序を逆転(最長から最短)できます。
  • 返されたトークンをさらに使用できるものに変換するには、node-set()拡張関数を使用する必要があります。
+0

これは素晴らしいです!これは私が探していたものです。ありがとうございました!残りのトークン( "/ Geography/NA"など)を保持したまま、 "/ Geography"トークンを削除する方法を教えていただけたら、ボーナスポイントが表示されます。 –

+0

'トークン'を 'xsl:if test =" contains(部分的な後置($ lead、 '/') '/') ''にラップすることができます。 – Tomalak

+0

パーフェクト。再度、感謝します! –

0

これをトークン化して、concatenatesという興味のある部分だけを再帰的に作成するテンプレートを作成します(私はここに座って書きませんが、XPathとset:leadingの組み合わせを使用します)。まず最初に完全なノードセットを作成し、最後のノードを除くすべてのノードを作成し、次に最後の2つのノードを除くすべてのノードを作成するなど - 最後に削除したノードセットと完全なノードセットをテンプレートparamsとして渡します)あなたがノードセットの始めに達するまで)。

幸いにも、これはフィボナッチシーケンスのような恐ろしいものではなく、うまく単純な階乗的な再帰です。

関連する問題