Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xquery/xpath比较除特定节点以外的所有节点_Xpath_Xquery_Marklogic - Fatal编程技术网

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中的空白有时会很有用。我通常会在所有元素上使用条带空间,并允许解析器缩进结果。请注意,您可能需要序列化结果以获得空白规范化。。