xquery/xpath比较除特定节点以外的所有节点
我有两个文档要比较,但我想省略两个我知道会不同的节点的比较,例如:xquery/xpath比较除特定节点以外的所有节点,xpath,xquery,marklogic,Xpath,Xquery,Marklogic,我有两个文档要比较,但我想省略两个我知道会不同的节点的比较,例如: <record> <core> <title>test1</title> <description>testDesc1</description> <ingestDate>2019-03-01</ingestDate> </core> <specialized&g
<record>
<core>
<title>test1</title>
<description>testDesc1</description>
<ingestDate>2019-03-01</ingestDate>
</core>
<specialized>
<item>testItem1</item>
<itemRecordingTime>2019-12-05T08:15:00</itemRecordingTime>
</specialized>
</record>
测试1
testDesc1
2019-03-01
测试项目1
2019-12-05T08:15:00
及
测试1
testDesc1
2020-03-01
测试项目1
2020-12-05T08:15:00
在xquery或xpath中,除了节点
和
之外,是否有其他方法可以比较这两个文档?我将规范化内容,删除您不想比较的元素,然后使用它们来比较规范化文档
下面是一个如何使用XSLT删除元素的示例(也可以使用已安装的样式表而不是eval):
xquery版本“1.0-ml”;
声明函数本地:比较($a,$b){
让$xslt:=
让$normalized-a:=xdmp:xslt eval($xslt,$a)
让$normalized-b:=xdmp:xslt eval($xslt,$b)
返回fn:深度相等($normalized-a,$normalized-b)
};
让$doc-a:=
测试1
testDesc1
2019-03-01
测试项目1
2019-12-05T08:15:00
让$doc-b:=
测试1
testDesc1
2020-03-01
测试项目1
2020-12-05T08:15:00
返回
本地:比较($doc-a,$doc-b)
我将规范化内容,删除您不想比较的元素,然后使用它们来比较规范化文档
下面是一个如何使用XSLT删除元素的示例(也可以使用已安装的样式表而不是eval):
xquery版本“1.0-ml”;
声明函数本地:比较($a,$b){
让$xslt:=
让$normalized-a:=xdmp:xslt eval($xslt,$a)
让$normalized-b:=xdmp:xslt eval($xslt,$b)
返回fn:深度相等($normalized-a,$normalized-b)
};
让$doc-a:=
测试1
testDesc1
2019-03-01
测试项目1
2019-12-05T08:15:00
让$doc-b:=
测试1
testDesc1
2020-03-01
测试项目1
2020-12-05T08:15:00
返回
本地:比较($doc-a,$doc-b)
备选方案。您可以使用XPath来提取文本节点并对其进行连接。将结果存储在两个变量中并进行比较
XPath 2.0:
string-join(//*/*[position()<last()]/text()[normalize-space()])
输出:
String='test1testDesc1testItem1'
String='test1testDesc1testItem1'
XPath 1.0(海量):
输出:
String='test1testDesc1testItem1'
String='test1testDesc1testItem1'
另类。您可以使用XPath来提取文本节点并对其进行连接。将结果存储在两个变量中并进行比较 XPath 2.0:
string-join(//*/*[position()<last()]/text()[normalize-space()])
输出:
String='test1testDesc1testItem1'
String='test1testDesc1testItem1'
XPath 1.0(海量):
输出:
String='test1testDesc1testItem1'
String='test1testDesc1testItem1'
你想做什么样的比较(
deep equal
?),你想得到什么样的结果(如果相等,则为true,否则为false)?我会先规范化内容(删除不想比较的元素),然后执行比较。是的,deep equal。首先删除元素可能是个好主意!你想做什么样的比较(deep equal
?),你想得到什么样的结果(如果相等,则为true,否则为false)?我会先规范化内容(删除不想比较的元素),然后执行比较。是的,deep equal。首先删除元素可能是个好主意!有时,使用XSLT规范化XML中的空白也很有用。我通常会在所有元素上使用条带空间,并允许解析器缩进结果。请注意,您可能需要序列化结果以获得空白规范化。使用XSLT规范化XML中的空白有时会很有用。我通常会在所有元素上使用条带空间,并允许解析器缩进结果。请注意,您可能需要序列化结果以获得空白规范化。。