2015-12-15 73 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。 –