2011-11-01 157 views
3

我在eXist上写xquery。xpath中的变量

通常我用这种方式在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()

回答

5

你想做eval()函数做什么,所以任何解决方案将有eval相同的问题。您可以考虑的另一种方法是生成一个查询然后执行它,但它会有完全相同的问题。如果您认为将字符串限制为XPath表达式的子集可能更安全(例如,没有谓词或没有函数调用),那么您可以尝试使用简单的正则表达式来测试这些条件。

+0

好吧,看来我没有任何其他选择。谢谢。 – owenwater

1

尽管迈克尔凯说得对,也许functx:dynamic-path()有一些帮助。

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

希望这有助于

迈克尔

+0

我不确定这是不是一个好主意,但至少eXist现在不支持此功能。 – owenwater

+0

@owen_water你需要包含functx库。请参阅:http://www.xqueryfunctions.com/xq/functx-1.0-doc-2007-01.xq – wst