使用 xml 中多个位置存在的元素创建 tde 模板

问题描述 投票:0回答:1

我正在使用 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 毕业了 伦敦
xml marklogic
1个回答
0
投票

您可以将上下文设置为

/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)
© www.soinside.com 2019 - 2024. All rights reserved.