2012-01-13 30 views
1

変数をXPath式の一部として使用したいと考えています。変数をXPath選択の一部として使用する

私の問題は、msxslノードセット機能...確かではないかもしれません。しかし、その雲があなたの判断を下さないようにしてください...

私はコンテンツファイルをロードするために.NET関数を使用しています。これは、オーダーメイドのXMLコンテンツで渡されます。 @fileはXMLファイルになります。

インクルードは、ページ上に座ってオーダーメイドのXMLは次のようになります。XSLがどのように見える

<control name="import" file="information.xml" node="r:container/r:group[@id='set01']/r:item[1]" /> 

<xsl:variable name="document"> 
    <xsl:copy-of select="ext:getIncludedContent(@file)" /> 
</xsl:variable> 

私はそのように、私は照会することができますノードセットにこれを翻訳しています文書

<xsl:variable name="preset-xml" select="msxsl:node-set($document)" /> 

私のようなルックスにロードしていますソースファイル:

<container> 
    <group id="set01"> 
     <item>value01</item> 
     <item>value02</item> 
     <item>value03</item> 
    </group> 
    <group id="set02"> 
     <item>value04</item> 
     <item>value05</item> 
    </group>      
</container> 

この時点までは動作します。ソースファイルがXMLとして渡されて出力されるのがわかります。

私の問題は、コンテンツからフィードされたXPath式をソースファイルに照会しようとしているときに発生します。

は、私が試してみた:それはXMLでロードの直接の子として@nodeを探しとしては機能しません明らかに

<xsl:value-of select="$preset-xml/@node" /> 

私が試してみた:

<xsl:variable name="node" select="@node" /> 
<xsl:value-of select="$preset-xml/$node" /> 
をしかし、それは第二の可変が好きではありません。

私はconcat($ preset-xml、 '/'、$ node)を試しましたが、それでも結果内のドキュメント全体が描画されます。

<xsl:value-of select="$preset-xml/r:container/r:group[@id='set01']/r:item[1]" /> 

正しくvalue01

スルーもたらししかし、それは、ハードコード化されたソリューションです:私は現時点では、この作業を取得することができます

唯一の方法は、テンプレート内の完全な表現を書き出すことです。 コンテンツファイルから宣言されたパラメータを使用して、あらゆる種類のインポートされたコンテンツに合わせてコンテンツから操作できるソリューションを開発したいと考えています。

p.s.技術管理者がXSLの後のバージョンをサポートするようにMicrosoftのパーサーを変更しないため、私はXSLT 1.0を使用しています。

+0

'$ preset-xml/@ node'は子ノードを探していません。それは属性を探しています。 –

+0

http://stackoverflow.com/questions/1551526/is-it-possible-to-use-a-dynamic-xpath-expression-in-a-xslt-style-sheet –

+0

うん、申し訳ありません。軽いタイプミス。ロードされたファイルの属性を探しています。しかしどちらの方法でも、その方法はまだ機能しません。まだ少しぼんやり! – Kevin

答えて

0

XSLTでのリフレクションと同様の機能はありません。 MS XSLTエンジンは、XSLTがロードされたときにXPathクエリをコンパイルします.XSLTがXMLドキュメントに適用されたときではありません。これには理由があります。データ(入力XML)からコード(XSLT)を分離します。

コードとデータを混在させて何を達成しようとしていますか?入力XMLから任意のXPath式を実際に実行する必要がありますか?たとえば、ユーザーが@nameに合格すればどうなるでしょうか? //*を入力してから、重要なデータが含まれている可能性がある入力XMLドキュメント全体の内容を出力に送信します。

あなたが実際に説明したことを行う必要がある場合は、独自のXSLT extension objectを書くことができます。ドキュメントルートとXPathクエリを受け入れ、後者は前者に適用されます。そして、あなたがそのようにそれを呼び出すことができるようになります:concat($preset-xml,'/',$node)であなたの元の試みについては

<xsl:value-of select="myExtensionNs:apply-xpath($preset-xml, @node)"/> 

concatは機能を連結した文字列です。いくつかの引数を渡し、文字列表現の連結を返します。したがって、concat($preset-xml,'/',$node)は、文字列値$preset-xmlを連結し、/と連結し、文字列値$ nodeと連結します。必要なXPathクエリを書く場合は、concat('$preset-xml','/',$node)がより論理的に見えます(引用符に注意してください)。結果として得られる文字列(例えば、$preset-xml/r:container/r:group[@id='set01']/r:item[1])を対応するXPathクエリの値に評価する方法はありません。それは出力に送ることしかできませんでした。