2012-04-12 5 views
1

私は、SAXON Javaを使用してsubstring-after()を使用するXPath式を評価しています。複数のテキストノードを単一のものに変換するXPath関数

A sequence of more than one item is not allowed as the first argument of substring-after().

単一一つに複数のテキスト・ノードを変換する任意のXPath関数があります:この関数は、時に私にいくつかのDOMに対して実行次のエラーを与えますか?ここで私はテスト違うのXPathです:

1. substring-after(normalize-space(//*[@id='PrintArea']//div/p[1]//span/font), ':') 

2. substring-after(normalize-space(//*[@id='PrintArea']//div/p[1]//span/font[1]), ':') 

3. substring-after(//*[@id='PrintArea']//div/p[1]//span/font/text(), ':') 

4. substring-after(//*[@id='PrintArea']//div/p[1]//span/font[1]/text(), ':') 

5. substring-after(//*[@id='PrintArea']//div/p[1]//span/font/text()[position()=1], ':') 

5. substring-after(//*[@id='PrintArea']//div/p[1]//span/font[1]/text()[position()=1], ':') 

私もFirebugののFirePathが正常に上記のすべてを評価することを追加する必要があります。

答えて

4

substring-afterに最初の引数(私はそれをARGと呼ぶ)が複数のノードを含む場合、XPath 1.0は最初のものを除くすべてのものを無視します。それが必要な場合は、ARGを(ARG)[1]に変更して明示的にします。括弧に注意してください:/a/b/c/text()[1]は必要な効果を持たないでしょう、それは(/a/b/c/text())[1]である必要があります。

他に2つの解釈が考えられます。最初の引数で返されたテキストノードごとに、最初のコロンの後の部分文字列を返します。それは

ARG/substring-after(., ':') 

だろうそれとも、言いたいことがあります。単一の文字列に最初の引数によって返されたテキスト・ノードを連結し、最初のコロンの後にこの文字列の部分を見つけます。

substring-after(string-join(ARG, ''), ':') 

したがって、これらの3つの動作のどちらに応じて、一致させる構文を選択します。 XPath 2.0は、あなたの意図を推測するのが危険であるため、エラーになります。

+0

答えをありがとう。あなたの最初の解決策(全体のXPathをカッコで囲む)は、text()を使わなくても気をつけました(substring-afterは結果をテキストに暗黙にキャストしているようです)。なぜ、/ a/b/c [1]は動作しません(/ a/b/c)[1]?違いはありますか? – Mohsen

+0

substring-afterは文字列を返します。文字列はテキストノードと全く同じではありません。/a/b/c [1]は/ a/b /(c [1])を意味し、各/ a/bノードの最初のc子を返します。 –

1

string-join functionspec)を使用すると、1つの文字列に変換できるはずです。これは文字列のリストをとり、結果として単一の文字列を与えます。セパレータとして空文字列を使用します。

関連する問題