2011-11-01 36 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