我正在尝试编写一个函数,该函数获取两个xml文件和一个xpath的位置,如果两个xpath具有相同的值,则返回true。我正在使用deep-equal
函数。当我传递deep-function
函数中的值时,我得到了正确的答案。但是,当我尝试在本地函数中获取值时,我总是得到true
。我可能错误地接受了这些参数。
请帮助我在这里做错了什么?
这给出了正确的值:
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>
答案 0 :(得分:1)
在您的示例中,$ xpath是一个字符串。无论doc1还是doc2是上下文节点,它都是相同的字符串。因此,您需要将字符串与自身进行比较。
您要做的是将字符串$ xpath的内容视为XPath表达式,并评估该表达式。 XQuery中没有任何功能可以做到这一点,但许多实现都有某种扩展功能,通常称为xx:eval或xx:evaluate其中xx指的是供应商定义的命名空间。