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 相同的问题。您可以考虑的另一种方法是生成查询然后执行它,但它会遇到完全相同的问题。如果您认为将字符串限制为 XPath 表达式的子集(例如没有谓词或没有函数调用)可能更安全,那么您可以尝试使用简单的正则表达式测试这些条件。

于 2011-11-01T08:23:46.177 回答
1

尽管 Michael Kay 是对的,但也许functx:dynamic-path () 会有所帮助。

它可能是介于 fn:eval 和动态生成查询之间的一个很好的中间解决方案。

希望这可以帮助

迈克尔

于 2011-11-02T12:50:23.770 回答