MarkLogic XDMP-COMPARE -- 项目不具有可比性: xs:QName( "foaf:OnlineAccount" )



我需要从审计文件中检索属性出处信息。

declare namespace prov = "http://www.w3.org/ns/prov#";
for $i in fn:doc("/com.marklogic.smart-mastering/auditing/merge/2dc05692-a447-47d0-b366-3eb2a66351f7.xml")//prov:document
where $i//prov:type = 'assetTypeDescription'
return 
<auditDocument>
{($i//prov:entity, $i//prov:time)}
</auditDocument>

xml内容类似于:

<prov:document xmlns:prov="http://www.w3.org/ns/prov#" xmlns:foaf="http://xmlns.com/foaf/0.1/" 
xmlns:sm="http://marklogic.com/smart-mastering/auditing#" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
*********************************
<prov:agent prov:id="http://marklogic.com/smart-mastering/auditing#user-admin">
<prov:type xsi:type="xsd:QName" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">foaf:OnlineAccount</prov:type>
<foaf:accountName>admin</foaf:accountName>
</prov:agent>
*********************************
<prov:hadMember>
*******************************
<prov:entity prov:id="http://marklogic.com/smart-mastering/auditing#/Asset/db3159f5-15b5-468c-a0b3-ad88d63ac5f6.jsonassetTypeDescription5d5170c3783d3e9c7beaac2a69e1392c15169f95b90b3cadd75d6fb52ea40e6083d7cb41fff12bce13145bc58ffca859b04be7f9429373733e6464ac01a1d907">
<prov:type>assetTypeDescription</prov:type>
<prov:label>/Asset/db3159f5-15b5-468c-a0b3-ad88d63ac5f6.json:assetTypeDescription</prov:label>
<prov:location>/Asset/db3159f5-15b5-468c-a0b3-ad88d63ac5f6.json</prov:location>
<prov:value>Stock</prov:value>
</prov:entity>
*************************

它抛出错误:

[1.0-ml] XDMP-COMPARE: (err:XPTY0004) $i/descendant::prov:type = "assetTypeDescription" -- Items not comparable: xs:QName("foaf:OnlineAccount") = "assetTypeDescription"

问题是文档中的第一个prov:type元素具有声明的模式类型:

<prov:type xsi:type="xsd:QName" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">foaf:OnlineAccount</prov:type>

当存在项的模式类型时(通过显式xsi:type属性,或者当模式加载到schemas数据库中时(,代码将评估"模式感知",并知道元素和属性是什么数据类型。这可以更改代码的行为。对于这样的实例,您不一定会得到预期的自动类型强制,相反,它会抛出一个错误,告诉您不能将xs:QName与字符串进行比较。

如果要将prov:type值视为字符串,则删除@xsi:type或更改where子句以替代计算字符串值:

where $i//prov:type/string() = 'assetTypeDescription'

最新更新