从根节点提取元素并填充每个文档

时间:2019-01-31 02:38:57

标签: marklogic marklogic-9 mlcp marklogic-dhf

MarkLogic版本:9.0-6.2

这是我正在使用mlcp提取到暂存db中的示例xml文件。我的要求是将每个策略的xml拆分为单独的文档,但是在将TransactionRequestDt重新格式化为YYYYMMDDHHMMSS之后,在将uri_id创建为/policy/PolNum/TransactionRequestDt.xml时。示例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无法用于转换(因为它不在“策略”汇总中)。

访问TransactionRequestDt并在uri中使用它的最佳方法是什么?我尝试过

-transaction_param TransactionRequestDt

但是看起来参数值是以'TransactionRequestDt'(字符串)而不是TransactionRequestDt的实际日期值传递的。

1 个答案:

答案 0 :(得分:1)

我会考虑不使用-aggregate_record_element参数,因此您可以访问转换内部的完整文档(因此,整个文件将被调用一次)。在内部读取并标准化该日期,获取Policy子级(使用类似content.xpath('/PolicyInfo/Policy')的子级),对其进行迭代,并构建一系列{ uri: ..., value: ... }对象以作为转换结果返回。 MLCP会检测到您正在返回多个结果,并将所有结果都写入。

这里有一个带有示例代码的类似SO答案。请注意,它涉及拆分JSON,而不是XML。不要执行toObject(),而应使用xpath(),也不需要xdmp.toJSON()

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

HTH!