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

Extract element from root node and populate with each document

MarkLogic 版本:9.0-6.2

这是我使用 mlcp 摄取到暂存数据库中的示例 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 不可用于转换(因为它在 'Policy' 聚合之外)。

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

-transaction_param TransactionRequestDt

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

我会考虑不使用 -aggregate_record_element 参数,这样您就可以访问转换中的完整文档(因此将对整个文件调用一次)。在内部读取并规范化该日期,获取 Policy 子项(使用 content.xpath('/PolicyInfo/Policy') 之类的东西),迭代这些子项,并构建一个 { uri: ..., value: ... } 对象序列到 return 作为转换的结果. MLCP 会检测到您正在 return 多个结果,并将它们全部写入。

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

HTH!