MarkLogi c XDMP-COMPARE - Несопоставимые элементы: xs: QName ("foaf: OnlineAccount") - PullRequest
1 голос
/ 18 апреля 2020

Мне нужно получить информацию о происхождении имущества из файла аудита.

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"

1 Ответ

3 голосов
/ 18 апреля 2020

Проблема в том, что первый элемент prov:type в do c имеет объявленный тип схемы:

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

Когда есть типы схем для элементов (либо через явный атрибут xsi:type, или когда схемы загружаются в базу данных схем), тогда код оценивает «осведомленные о схеме» и знает, к какому типу данных относятся элементы и атрибуты. Это может изменить поведение кода. В подобных случаях вы не обязательно получите ожидаемое приведение типа c, а вместо этого выдается ошибка, сообщающая, что вы не можете сравнить xs:QName со строкой.

Если Вы хотите трактовать значение prov:type как строку, а затем либо удалите @xsi:type, либо измените предложение where, чтобы явно оценить значение строки:

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