2015-12-15 70 views
1

我想寫一個函數,它需要兩個xml文件和一個xpath的位置,並返回true,如果兩個xpaths具有相同的值。我正在使用deep-equal函數。當我通過deep-function函數中的值時,我正在得到正確的答案。但是,當我試圖在本地函數中獲取值時,我總是得到一個true。我可能會錯誤地使用參數。Xquery函數來比較兩個不同的xmls的兩個xpaths

請幫我在這裏做錯了嗎?

這給正確的值:

deep-equal(doc("C:/xml/1/abc.xml")/root/messageHeader/system, doc("C:/xml/2/abc.xml")/root/messageHeader/system) 

這給true總是:

declare function local:findDiff($first as xs:string, $second as xs:string, $xpath as node()*){ 

let $doc1 := (doc($first))/$xpath 
let $doc2 := (doc($second))/$xpath 

return deep-equal($doc1, $doc2)}; 

<findDiff>{local:findDiff("C:/xml/1/abc.xml", "C:/xml/2/abc.xml", root/messageHeader/system)}</findDiff> 

回答

1

在您的例子$ XPath是一個字符串。無論doc1還是doc2是上下文節點,它都是相同的字符串。因此,您將字符串與自身進行比較。

您要做的是將字符串$ xpath的內容視爲XPath表達式,然後評估該表達式。在XQuery中沒有這樣做的功能,但許多實現都有一些用於此目的的擴展功能,通常稱爲xx:eval或xx:evaluate其中xx是指供應商定義的名稱空間。

+0

請你指點一下這些實現嗎?我找不到任何東西。 – tanvi

+1

@tanvi,參見http://saxonica.com/html/documentation9.6/functions/saxon/evaluate.html Saxon 9.6 PE或EE。 –

+1

@tanvi,或者查看BaseX的http://docs.basex.org/wiki/XQuery_Module#xquery:eval。 –