我正在使用MLCP(Marklogic Content Pump)将内容从一个数据库复制到另一个数据库。在这里,我使用的是 -query_filter 选项,它的值是一组 cts:element-range-query 包装在 cts:and-query 中的一组 cts:element-range-query 的 XML 序列化格式的 cts:query :
<cts:and-query xmlns:cts="http://marklogic.com/cts">
<cts:element-range-query operator=">">
<cts:element xmlns:c="http://iddn.icis.com/ns/core">c:released-on</cts:element>
<cts:value xsi:type="xs:dateTime" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2000-12-21T00:00:00Z</cts:value>
</cts:element-range-query>
<cts:element-range-query operator="<">
<cts:element xmlns:c="http://iddn.icis.com/ns/core">c:released-on</cts:element>
<cts:value xsi:type="xs:dateTime" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2016-12-21T00:00:00Z</cts:value>
</cts:element-range-query>
</cts:and-query>
现在,上述查询在 ML Qconsole 上执行时返回有效结果,但在 MLCP 的 -query_filter 选项中传递时,它会给出错误,指出"无效的属性值字符'<'。
Marklogic和MLCP的版本是8.0-5。
在进一步深入研究时,我观察到问题仅在运算符值小于"<</strong>"时才存在
注意:我已经在数据库上为元素"发布日期"配置了一个有效的范围索引。
MarkLogic 鼓励在使用序列化为 XML 的 cts 查询时使用选项文件,因为底层操作系统可以在命令行上解释特殊字符。
我的第一个猜测是尝试创建一个文件,例如,options.txt
内容:
--query_filter
<cts:and-query xmlns:cts="http://marklogic.com/cts">
<cts:element-range-query operator=">">
<cts:element xmlns:c="http://iddn.icis.com/ns/core">c:released-on</cts:element>
<cts:value xsi:type="xs:dateTime" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2000-12-21T00:00:00Z</cts:value>
</cts:element-range-query>
<cts:element-range-query operator="<">
<cts:element xmlns:c="http://iddn.icis.com/ns/core">c:released-on</cts:element>
<cts:value xsi:type="xs:dateTime" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2016-12-21T00:00:00Z</cts:value>
</cts:element-range-query>
</cts:and-query>
(不过,您可能必须使所有XML都适合该文件的同一行)
然后使用
mlcp.sh -options_file选项.txt ...