2

XML インスタンスが与えられた場合:

<fruits>
    <fruit>Apple</fruit>
    <fruit>Orange</fruit>
    <fruit>Banana</fruit>
</fruits>

私はループを使用しています:

XPathExpression expr = xpath.compile("/fruits/fruit/text()");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0 ; i < nodes.getLength() ; i++) 
    System.out.println(nodes.item(i).getNodeValue());

果物の名前のリストを印刷します。返されたシーケンスで名前が既に小文字lower-caseになっているように、外側の XPath 式で使用する方法はありますか? 次のように、 Java メソッドを使用したり、各項目で関数を呼び出したりしたくありません。String toLowerCase()lower-case()

System.out.println(xpath.compile("lower-case(.)").evaluate(nodes.item(i)));

... 1 つの XPath 式でそれを達成する方法はありますか?それは外側のループに対して 1 回だけ評価されますか?

Ivyファイルに次の Saxon 依存関係があるため、XPath 2.0 機能にもアクセスできます。

<dependency org="net.sf.saxon" name="Saxon-HE" rev="9.4"/> 
4

1 に答える 1

2

Java は XPath 1.0 のみをサポート

Plain Java の XPath エバリュエータは XPath 2.0 をサポートしていないため、まったく使用できませんfn:lower-case(...)toLowerCase()単一の結果ごとにJava の関数を使用します。

XPath 2.0 を使用している場合

他の XPath エンジンを使用している場合は、次の式を使用してすべての果物の名前を小文字に変換し、単一の果物の名前を受け取ります。

/fruits/fruit/text()/lower-case(.)

fn:lower-case(...)XPath 1.0 でのシミュレーション

できることは を使用することだけですがtranslate(some-string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')、これは単一の値でのみ機能します。

于 2013-06-28T16:48:55.393 に答える