基于MarkLogic TDE提取XML多层级城市字段生成多行数据
MarkLogic TDE提取不同层级城市字段并生成独立行需求
我在使用MarkLogic的TDE(模板驱动提取)功能时,遇到一个需求:需要提取XML中不同层级下的city字段值。如果存在多个城市值,不能合并到同一列(比如制表符分隔形式),而是要为同一人员(例如John Doe)生成独立的数据行。
现有TDE模板代码
let $template= <template xmlns="http://marklogic.com/xdmp/tde"> <context>/data/person/address</context> <rows> <row> <schema-name>test</schema-name> <view-name>data</view-name> <columns> <column> <name>address</name> <scalar-type>string</scalar-type> <val>/city</val> </column> </columns> </row> </rows> </template>
待提取的XML数据
<data> <person> <name>John Doe</name> <age>30</age> <address> <city>New York</city> <country>USA</country> </address> </person> <employee> <education>graduated</education> <address> <city>London</city> <country>UK</country> </address> </employee> </data>
期望输出结果
| name | age | education | city |
|---|---|---|---|
| John Doe | 30 | null | New York |
| John Doe | 30 | graduated | London |
解决方案:调整TDE模板
要实现需求,需修改TDE模板的上下文和字段提取逻辑,让每个address节点生成一行数据,并关联对应的人员信息:
let $template = <template xmlns="http://marklogic.com/xdmp/tde"> <context>/data/*/address</context> <rows> <row> <schema-name>test</schema-name> <view-name>data</view-name> <columns> <column> <name>name</name> <scalar-type>string</scalar-type> <val>../name</val> </column> <column> <name>age</name> <scalar-type>int</scalar-type> <val>../age</val> </column> <column> <name>education</name> <scalar-type>string</scalar-type> <val>../education</val> </column> <column> <name>city</name> <scalar-type>string</scalar-type> <val>./city</val> </column> </columns> </row> </rows> </template>
关键说明:
- 上下文设置:
/data/*/address会匹配person和employee节点下的所有address,每个address单独生成一行数据; - 字段关联:通过
../向上遍历父节点,提取person的name、age和employee的education字段,不存在的字段会自动返回null; - 城市提取:直接通过
./city获取当前address下的城市值,确保每个地址对应独立行。
内容的提问来源于stack exchange,提问作者user3636924
相关产品推荐
相关产品推荐

