Извлечь элемент из корневого узла и заполнить каждый документ - PullRequest
0 голосов
/ 31 января 2019

MarkLogic версия: 9.0-6.2

Вот пример XML-файла, который я загружаю в промежуточную базу данных, используя mlcp.Мое требование - разделить xml на отдельные документы для каждой Политики, но при создании uri_id как /policy/PolNum/TransactionRequestDt.xml после переформатирования TransactionRequestDt в YYYYMMDDHHMMSS.Примером uri является /policy/P123/201610171533390000000.xml

<?xml version="1.0" encoding="UTF-8"?>
<PolicyInfo>
    <TransactionRequestDt>2016-10-17T15:33:39.770<TransactionRequestDt>
    <Policy>
        <PolNum>P123</PolNum>
        ....
        ....
    </Policy>
   <Policy>
        <PolNum>P456</PolNum>
        ....
        ....
    </Policy>
</PolicyInfo>

У меня есть mlcp-код, похожий на приведенный ниже

mlcp.sh import -ssl \
-host localhost \
-port 8010 \
-username nnnn \
-password ffff \
-input_file_path /f1/f2 \
-input_file_type aggregates \
-aggregate_record_element Policy \
-output_collections policy \
-output_uri_prefix /policy/ \
-uri_id PolNum \
-transform_module /ext/ingesttransform.sjs \
-output_uri_suffix ".xml"

Моя мысль состоит в том, чтобы использовать функцию преобразования для переформатирования TransactionRequestDt, но реализованочто элемент TransactionRequestDt не был доступен для преобразования (как это было за пределами агрегата «Policy»).

Каков наилучший способ получить доступ к TransactionRequestDt и использовать его в uri?Я попытался

-transaction_param TransactionRequestDt

, но похоже, что значение параметра передается как «TransactionRequestDt» (строка) вместо фактического значения даты TransactionRequestDt.

1 Ответ

0 голосов
/ 31 января 2019

Я бы не стал использовать параметр -aggregate_record_element, поэтому вы получите доступ к полному документу внутри преобразования (который, следовательно, будет вызываться один раз для всего файла).Внутри вы читаете и нормализуете эту дату, получите дочерние элементы Политики (используя что-то вроде content.xpath('/PolicyInfo/Policy')), выполните итерации по ним и создайте последовательность объектов { uri: ..., value: ... } для возврата в результате преобразования.MLCP обнаружит, что вы возвращаете несколько результатов, и запишите их все.

Здесь аналогичный ответ SO с примером кода.Имейте в виду, что это говорит о расщеплении JSON, а не XML.Не делайте toObject(), но используйте xpath() вместо этого, и вам не нужно xdmp.toJSON():

https://stackoverflow.com/a/36506478/918496

HTH!

...