Xquery函数比较两个不同xmls的两个xpath

时间:2015-12-15 07:17:26

标签: xml xslt xpath xquery

我正在尝试编写一个函数,该函数获取两个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>

1 个答案:

答案 0 :(得分:1)

在您的示例中,$ xpath是一个字符串。无论doc1还是doc2是上下文节点,它都是相同的字符串。因此,您需要将字符串与自身进行比较。

您要做的是将字符串$ xpath的内容视为XPath表达式,并评估该表达式。 XQuery中没有任何功能可以做到这一点,但许多实现都有某种扩展功能,通常称为xx:eval或xx:evaluate其中xx指的是供应商定义的命名空间。