1

substring-after() を使用する XPath 式を評価するために SAXON Java を使用しています。この関数をいくつかの DOM に対して実行すると、次のエラーが表示されます。

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

複数のテキスト ノードを 1 つのノードに変換する XPath 関数はありますか? 私がテストするさまざまな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

2 に答える 2

4

substring-afterの最初の引数(これをARGと呼びます)に複数のノードが含まれている場合、XPath1.0は最初の引数を除くすべてを無視します。それが必要な効果である場合は、ARGを(ARG)[1]に変更して、これを明示的にします。括弧に注意してください:/a/b/c/text()[1]必要な効果はありません。必要です(/a/b/c/text())[1]

他に2つの考えられる解釈があります。あなたは言いたいかもしれません:最初の引数によって返されるテキストノードのそれぞれについて、最初のコロンの後に部分文字列を返します。それは

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

または、次のように言うこともできます。最初の引数によって返されたテキストノードを1つの文字列に連結し、この文字列の最初のコロンの後の部分を見つけます。それは

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

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

于 2012-04-12T08:56:02.907 に答える
1

string-join関数spec )を使用して、それらを単一の文字列に変換できるはずです。これにより、文字列のリストが取得され、結果として単一の文字列が得られます。空の文字列を区切り文字として使用します。

于 2012-04-12T08:51:56.920 に答える