我正在使用 MarkLogic 进行 TDE。我有一个特定的场景,需要提取 XML 中不同级别可用的城市。如果有多个值,城市值必须转到同一列值,而不是制表符分隔或任何其他值,但必须被视为人/姓名的另一行,即 John Doe。
以下是我使用的数据:
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>
我使用的数据如下:
<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>
如果我查询我的 tde,我应该得到以下输出
名字 | 年龄 | 教育 | 城市 |
---|---|---|---|
约翰·多伊 | 30 | 空 | 纽约 |
约翰·多伊 | 30 | 毕业了 | 伦敦 |
您可以将上下文设置为
/data/*
,它将匹配 /data/person
或 /data/education
,或者您也可以匹配 /data/*/address
。
有了要从中创建行的重复项的上下文,您就可以使用相对 XPath 来选择其他列的值:
let $data :=
<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>
let $template :=
<template xmlns="http://marklogic.com/xdmp/tde">
<context>/data/*</context>
<rows>
<row>
<schema-name>test</schema-name>
<view-name>data</view-name>
<columns>
<column>
<name>name</name>
<scalar-type>string</scalar-type>
<val>../person/name</val>
</column>
<column>
<name>age</name>
<scalar-type>int</scalar-type>
<val>../person/age</val>
</column>
<column>
<name>education</name>
<scalar-type>string</scalar-type>
<val>education</val>
<nullable>true</nullable>
</column>
<column>
<name>address</name>
<scalar-type>string</scalar-type>
<val>address/city</val>
<nullable>true</nullable>
</column>
</columns>
</row>
</rows>
</template>
return
tde:node-data-extract($data, $template)