2017-02-23 3 views
0

私はXSL(T)の新機能です。私はその関連性はよくわかりませんが、IBM DataPowerを使って作業しています。XSLT - 再帰的テンプレートからの変数代入

私はこのようになり、着信URIを解析するためにXSLを使用しようとしている:

http://ip:port/Nucleus_v2.9.3/SomeEndPoint

私は1つの変数と目的地へのバージョン(2.9.3)を抽出したい(SomeEndPoint)第2の変数に変換する。私は2つのパラメータ(上記のURIとスラッシュ文字)を取る再帰的なテンプレートを使用しようとしています。テンプレート内では、URIをトレースして両方の値を変数に取り込む要素を使用したいと考えています。

<xsl:template name="parseIncomingURI"> 
    <xsl:param name="string" /> 
    <xsl:param name="char" /> 
    <xsl:choose> 
     <xsl:when test="contains($string, $char) and contains($string, 'Nucleus_v')"> 
      <xsl:call-template name="parseIncomingURL"> 
       <xsl:with-param name="string" select="substring-after($string, $char)" /> 
       <xsl:with-param name="char" select="$char" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

は私が可能ですしようとしていると私はテンプレートを提供することを意図するものを誤解することができるかわからないんだけど。私は上記の "when"要素にバージョンを割り当てて、 "それ以外の場合"(再帰で最後のスラッシュに遭遇した後にトリガーする)にエンドポイント変数を割り当てたいとします。

私はこのテンプレートをXSLのどこか別の場所で呼び出し、元のURIと '/'文字を2つの初期パラメータとして渡します。私は、 "when"要素で、一部のsubstring-beforeおよびsubstring-after関数を使ってバージョンを取得する必要があることを認識しています。私はそれがこの例を混乱させると思うので、私はここにそのコードを含んでいません。

私は適切なトラックにいますか?どのような助けや指針をいただければ幸いです。私は必要に応じて編集してさらに情報を追加してうれしいです。

おかげで、 クリス

+0

"*テンプレート内では、URIをトレースして両方の値を変数に取り込む要素を使用したいと考えています。* "それはとにかく機能しませんでした:テンプレート内で定義された変数は、そのテンプレートに範囲が限定されるでしょう。 –

+0

よく知っています、私はそれについても疑問に思っていました。私は再帰パスを開始しましたが、URIパスから2つ以上の変数が引き出される可能性があると考えたので、私は '/'を分割したいと思っていましたが、それは直接可能ではなく、再帰は可能な回避策かもしれません。あなたが欲しかったものよりも多くの情報...しかし、それは最初に再帰につながったものです –

+0

再帰は複数の接頭辞/サフィックスのペアであり、n番目のトークンを抽出する必要があります。最後に一意の区切り記号でトークンを取得する方法を示す例です:http://stackoverflow.com/questions/38848374/how-to-find-lastプレビュー作業とストア・ツー・マイ・フィールド・イン・xslt/38848925#38848925 –

答えて

1

私はあなたがここに再帰的なテンプレートを必要としないと思います。これは純粋にXSLT 1.0のソリューションです

<xsl:variable name="destination" select="substring-after(substring-after(URI, 'Nucleus_v'), '/')" />  

;:として

<xsl:variable name="version" select="substring-before(substring-after(URI, 'Nucleus_v'), '/')" />  

と宛先:あなたはとバージョンを抽出できIBM DataPowerを使用している場合は、EXSLT Regular Expression extension functionsへのアクセス権もあります(マニュアルに従って)。一般

+0

ありがとうございますmichael.hor257k。私はこれを使うつもりです。そして、私は本当にEXSLT Regex拡張関数へのリンクを感謝します。私はIBM DataPowerを使い長旅を始めていますが、これは便利だと確信しています。 -Chris –

+0

彼らのドキュメントによれば、それらは広範囲のEXSLT関数をサポートしています - これらのいくつかは非常に便利です。 –

1

あなたは計算から2つのデータ項目を取得したい場合は、それを行うための2つの方法があります。

(a)の(別々の機能/表現/名前付きテンプレートに

を使用して、それぞれ独立して1を計算しますb)合成値を返す関数/式/名前付きテンプレートを記述する。 XSLT 1.0では、利用可能な複合値の唯一の種類はノードセットです。その後、ノードセットを返すことはできず、RTFだけを返す結果ツリーフラグメントの制限にぶつかりますが、これはexslt:node-set()を使用して簡単に回避できます。二つの別々の計算 - Iは、(a)のために行くだろう。この場合

(私は構造化文字列、例えばAAAA#BBBBなどの複合値を操作することが知られてきたが、それは少し必死になっています。)

+0

マイケルは同意しました、(a)私が行く予定の方法です。私は実際には、michael.hor257kの答えを2つの関数ベースの計算として見ていました。ここでは再帰テンプレートは必要ありませんでした。私は本当にあなたの答えをありがとう、私は可能な場合私はupvoteよ。どうもありがとう。 –

関連する問題