用于比较两个不同 xml 的两个 xpath 的 Xquery 函数
Xquery function to compare two xpaths of two different xmls
我正在尝试编写一个函数,该函数获取两个 xml 文件和一个 xpath 的位置,如果两个 xpath 具有相同的值,则 returns 为真。我正在使用 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>
在您的示例中,$xpath 是一个字符串。无论 doc1 还是 doc2 是上下文节点,它都是相同的字符串。因此,您正在将字符串与其自身进行比较。
您要做的是将字符串 $xpath 的内容视为 XPath 表达式,并计算该表达式。 XQuery 中没有函数可以做到这一点,但许多实现都有某种扩展函数用于此目的,通常称为 xx:eval 或 xx:evaluate,其中 xx 指的是供应商定义的名称空间。
我正在尝试编写一个函数,该函数获取两个 xml 文件和一个 xpath 的位置,如果两个 xpath 具有相同的值,则 returns 为真。我正在使用 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>
在您的示例中,$xpath 是一个字符串。无论 doc1 还是 doc2 是上下文节点,它都是相同的字符串。因此,您正在将字符串与其自身进行比较。
您要做的是将字符串 $xpath 的内容视为 XPath 表达式,并计算该表达式。 XQuery 中没有函数可以做到这一点,但许多实现都有某种扩展函数用于此目的,通常称为 xx:eval 或 xx:evaluate,其中 xx 指的是供应商定义的名称空间。