2011-10-27 7 views
0

XSLTで特定の文字列の値を繰り返し呼び出すユーザー定義関数を使用しようとしています。この文字列は、単一の関数呼び出しの範囲内で変更されないXPath式の結果に基づいています。私はそれを変数に代入するのは良いことだと思っていました。パスコールを必要とするudfで変数の値を設定する方法

残念ながら、少なくともSaxonの実装では、ファンクション内にノードを必要とするXPath式を使用することはできません。絶対パスに基づくノードであっても、最初にスローアウェイラインを使用しないと、他のものよりもむしろルート文書である。

したがって、たとえば、次のコードは、エラースロー:

<xsl:function name="udf:LeafMatch"> 
<xsl:param name="sID"></xsl:param> 
<xsl:variable name="myLeaf" select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/> 

通常は、解決策は、単に最初のコンテキストを与えるために、任意のグローバル変数を呼び出すことです。例えば、UDFの内側に、次の作品($ルートがルートノードで識別される変数です):

<xsl:for-each select="$root"> 
<xsl:value-of select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/> 
</xsl:for-each> 

しかし、これは動作しませんので、私の変数の値を修正するために、XPathを使用しようとするとfor-eachの中に式を入れることはできません。

また、私はここで見たものの上に行く、それにコンテキストを与えるために

<xsl:choose><xsl:when select"$root"><xsl:value-of select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/></xsl:when></xsl:choose> 

を使用してみました:http://www.stylusstudio.com/xsllist/200504/post00240.html

のいずれかに動作しなかったこと。

FWIW、関数に変数を渡すことは問題です。なぜなら、 "myleaf"を定義するために使用されるXpath式はコンテキストノードに依存するからです。現在の値に基づいてXpathに1つのパスを呼び出す方法はわかりませんコンテキストノード。

はたとえば、この関数を呼び出すコードで、私のようなものを持っている:私は/ポテト/ステム[アイ]ノードのコンテキストで作業して探すためにUDFを使用してい

<xsl:for-each select="/potato/stem[eye]"> 
<leaf = "{udf:LeafMatch(@sessionID)}"/> 
</xsl:for-each> 

/potato/stem [scc]ノードで、@sessionIDの値が同じです。 XMLツリーのまったく異なる部分の他のノードを検索するXPathの述語で、現在のコンテキストノードから@sessionIDの値を参照する方法がわからないので、udfを使用していました。プロセッサが毎回それを調べるのではなく、文字列に変数を使用しようとするまではうまくいきました。

私は、自分の関数自体が名前付きテンプレートを呼び出したり、オリジナルのfor-each内に名前付きテンプレートを入れたり、名前付きテンプレート呼び出しを関数に持たせたりすることを避けようとしていました。

だから私の質問は以下のとおりです。ユーザー定義関数の場合

A.、私はXPath式に依存変数を設定するのですか?

B.テストしようとしているXpath式の述語で現在のコンテンツノードから引き出された値を使用するには、Xpathにすばらしい方法がありますか?

+0

@David R:残念なことに質問を理解することは困難です。あなたは、質問を編集して、それを再現できるように完全な(しかし短い)例を提供してください。また、達成したいことを正確に教えてください。また、対応する(可能な限り短い)完全なソースXML文書を提供してください。特に、「変数の値を固定するためにXpathを使用しようとする」という意味は何ですか? –

+0

別の質問に関連するXMLの例を投稿しました。別の質問を検索するXPath式で、現在のノードに関連する属性を使用する方法(for-each節で言えば)の問題のみに焦点を当てました。その質問はこちら[リンク](http://stackoverflow.com/questions/7926680/xslt2-how-to-reference-attributes-about-the-current-node-in-xpath2-predicates) –

+0

@_David R:ありがとう私は新しい質問に答えました。 –

答えて

0

So my questions are:

A. For a user-defined function, how do I set a variable that depends on an XPath expression?

B. Is there a snazzy way in Xpath to use values drawn from the current content node in the predicates of the Xpath expression you are trying to test?

両方の質問はかなり不明です。

A:私はあなたが実際に意味想定しています

"Inside an xsl:function how do I define a variable that depend on the context node?"

答え:あなたがすることはできません。定義により、xsl:function内にコンテキストノードは存在しない。あなたは、しかし、パラメータとして意図コンテキストノード(または電流として使用されなければならないだけで文書ノード)を渡すことができ

"Within the body of a stylesheet function, the focus is initially undefined; this means that any attempt to reference the context item, context position, or context size is a non-recoverable dynamic error. [XPDY0002]"

:これは、次のようにW3C XSLT 2.0 specificationによって定義されます。あるいは、グローバルに定義された変数を参照することもできます。

B:この質問は完全に理解できないです:

  1. "粋" とは何ですか?

  2. "現在のコンテンツノード"とは何ですか?欲しい「すてきな」方法で成し遂げられる具体的な課題の例を挙げてください。

+0

最初の質問にお返事いただきありがとうございます。私の2番目の要求のスペルについては、詳細はこちらです:その質問はここにあります[リンク](http://stackoverflow.com/questions/7926680/xslt2-how-to-reference-attributes-about-the-current -node-in-xpath2-predicates) –

関連する問題