MarkLogic TDE для документов XML с XSD и XSI

Здравствуйте, я использую MarkLogic 9.0 и имею начальный уровень опыта работы с ML и XML. Я успешно следовал руководству MarkLogic SQL Guide и хочу использовать его в реальном мире и извлекать из транзакционных XML-файлов элемент type. Но в представлении, которое я создал, возвращается пустой результат. Я думаю, что это как-то связано с xsd и xsi. Но, как я упоминал ранее, я на начальном уровне и не знаю, как это исправить.

Следующий текст описывает сценарий для воспроизведения проблемы.

Я загружаю 3500 XML-документов в SQLData(с тройным индексом хранилища). Я также создал базу данных SQLSchema, которая связана с базой данных SQLData, как описано в Руководстве. Все XML-документы имеют похожую структуру, как в примере ниже:

<?xml  version="1.0" encoding="UTF-8"?>
<scope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <item>
    <transaction>
      <type>CI</type>
      <sscc>00000379461100000007</sscc>
      <location>4260210630688</location>
      <device>VISTALINK.004</device>
      <date>2017-04-25</date>
      <time>01:22:20</time>
      <gmtOffset>+02:00</gmtOffset>
      <actorId>155081</actorId>
    </transaction>
    <order>
      <orderNumber>3794611</orderNumber>
    </order>
  </item>
</scope>

с таким URI (все документы имеют одинаковую структуру):

/transactions/2017-04-25_01-22-20_3794611_00000379461100000007_CI.xml

Теперь я создал шаблон со следующей структурой:

xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde" 
        at "/MarkLogic/tde.xqy";

let $transactions :=
<template xmlns="http://marklogic.com/xdmp/tde">
  <context>/transactions</context>
  <rows>
    <row>
      <schema-name>main</schema-name>
      <view-name>transactions</view-name>
      <columns>
        <column>
          <name>type</name>
          <scalar-type>string</scalar-type>
          <val>type</val>
        </column>
    </columns>
    </row>
  </rows>
</template>
return tde:template-insert("Transactions.xml", $transactions)

Я также, чтобы изменить контекст:

<context>item</context>

и / пункт

Это не возвращает никакой ошибки, так что я думаю, что результат будет в порядке

Когда я выполняю следующий оператор в консоли SQL, он возвращает пустой результат:

select * from transactions;

Когда я проверяю вышеуказанный шаблон, он возвращает следующий результат:

<map:map xmlns:map="http://marklogic.com/xdmp/map" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<map:entry key="valid">
<map:value xsi:type="xs:boolean">false</map:value>
</map:entry>
<map:entry key="error">
<map:value xsi:type="xs:string">TDE-INVALIDTEMPLATENODE</map:value>
</map:entry>
<map:entry key="message">
<map:value xsi:type="xs:string">TDE-INVALIDTEMPLATENODE: Invalid extraction template node: /tde:template/tde:rows/text()</map:value>
</map:entry>
</map:map>

Итак, ошибка при проверке:

Invalid extraction template node: /tde:template/tde:rows/text()
Invalid extraction template node: 

/ TDE: шаблон / TDE: строки / текст ()

Кто-нибудь знает, как я могу это исправить?

1 ответ

Решение

Проблема в вашем контексте. Вы указали <context>item</context> но на основе вашего образца документа item это ребенок scope, Поэтому ваш шаблон должен выглядеть так:

xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde" at "/MarkLogic/tde.xqy";

let $transactions :=
<template xmlns="http://marklogic.com/xdmp/tde">
  <context>/scope/item/transaction</context>
  <rows>
    <row>
      <schema-name>main</schema-name>
      <view-name>transactions</view-name>
      <columns>
        <column>
          <name>type</name>
          <scalar-type>string</scalar-type>
          <val>type</val>
        </column>
    </columns>
    </row>
  </rows>
</template>
return tde:template-insert("Transactions.xml", $transactions)

Так что мы здесь делаем? Мы указываем контекст, который будет /scope/item/transaction потому что столбец type что вы указали в своем определении строки находится под этими элементами. Загрузка этого шаблона позволит вам выполнить оператор SQL SELECT * FROM transactions;

Другие вопросы по тегам