3

eXistに xquery を書いています。

通常、私はこの方法を使用してxmlでアイテムを選択します:

fn:doc($document_name)/root/a

しかし今、文字列変数から xpath を取得したいと考えています。

let $xpath := request:get-parameter("xpath", "")
fn:doc($document_name)/$xpath

もちろん、うまくいきません。私が今見つけた唯一の方法は、次を使用することevalです:

util:eval(fn:concat("fn:doc($document_name)", $xpath)):)

evalでも遅くて安全ではないので使いたくありません。

私は次のようなものがあることを知っています:

fn:doc($document_name)/*[name()='node_name']

しかし、ノードの名前だけでなく、パス全体でアイテムを選択したいのですが、使用しようとしましnode-xpath()たが、同じように使用する方法がわかりませんname()

4

2 に答える 2

5

あなたは eval() 関数がすることをしたいので、どのソリューションも eval と同じ問題を抱えています。考えられるもう 1 つのアプローチは、クエリを生成してから実行することですが、まったく同じ問題があります。文字列を XPath 式のサブセット (述語や関数呼び出しなしなど) に制限する方が安全であると思われる場合は、単純な正規表現を使用してそれらの条件をテストしてみてください。

于 2011-11-01T08:23:46.177 に答える
1

Michael Kay が正しいにもかかわらず、functx:dynamic-path () が役立つかもしれません。

これは、fn:eval とクエリの動的生成の間の適切な中間ソリューションである可能性があります。

お役に立てれば

マイケル

于 2011-11-02T12:50:23.770 に答える