使用 XSD 和 XSI 在 XML 文档上使用 MarkLogic TDE
MarkLogic TDE on XML documents with XSD and XSI
您好,我正在使用 MarkLogic 9.0,并且在 ML 和 XML 方面具有初学者水平的经验。我已成功遵循 MarkLogic SQL Guide 并希望在现实世界中使用它并从事务性 xml 文件中提取类型元素。但是在我创建的视图中 returns 是一个空结果。我认为这与 xsd 和 xsi 有关。但是正如我之前提到的,我处于初学者水平,我不知道如何解决这个问题。
以下文字描述了重现问题的场景。
我将 3500 个 xml 文档加载到 SQL 数据(具有三重存储索引)我还创建了一个与 SQL 数据相关的 SQL 模式数据库指南中描述的数据库。所有 XML 文档都具有类似于以下示例的结构:
<?xml version="1.0" encoding="UTF-8"?>
<scope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<item>
<transaction>
<type>CI</type>
<sscc>00000379461100000007</sscc>
<location>4260210630688</location>
<device>VISTALINK.004</device>
<date>2017-04-25</date>
<time>01:22:20</time>
<gmtOffset>+02:00</gmtOffset>
<actorId>155081</actorId>
</transaction>
<order>
<orderNumber>3794611</orderNumber>
</order>
</item>
</scope>
使用这样的 URI(所有文档都具有相似的结构):
/transactions/2017-04-25_01-22-20_3794611_00000379461100000007_CI.xml
现在我创建了一个具有以下结构的模板:
xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde"
at "/MarkLogic/tde.xqy";
let $transactions :=
<template xmlns="http://marklogic.com/xdmp/tde">
<context>/transactions</context>
<rows>
<row>
<schema-name>main</schema-name>
<view-name>transactions</view-name>
<columns>
<column>
<name>type</name>
<scalar-type>string</scalar-type>
<val>type</val>
</column>
</columns>
</row>
</rows>
</template>
return tde:template-insert("Transactions.xml", $transactions)
我也将上下文更改为:
<context>item</context>
和
/项目
它没有return任何错误所以我认为结果会很好
当我在 SQL 控制台中执行以下语句时,它 return 是一个空结果:
select * from transactions;
当我验证上面的模板时,return得到以下结果:
<map:map xmlns:map="http://marklogic.com/xdmp/map" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<map:entry key="valid">
<map:value xsi:type="xs:boolean">false</map:value>
</map:entry>
<map:entry key="error">
<map:value xsi:type="xs:string">TDE-INVALIDTEMPLATENODE</map:value>
</map:entry>
<map:entry key="message">
<map:value xsi:type="xs:string">TDE-INVALIDTEMPLATENODE: Invalid extraction template node: /tde:template/tde:rows/text()</map:value>
</map:entry>
</map:map>
所以通过验证的错误是:
Invalid extraction template node: /tde:template/tde:rows/text()
Invalid extraction template node:
/tde:template/tde:rows/text()
有人知道我该如何解决这个问题吗?
问题出在您的上下文中。您已指定 <context>item</context>
,但根据您的示例文档,item
是 scope
的子项。因此,您的模板应如下所示:
xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde" at "/MarkLogic/tde.xqy";
let $transactions :=
<template xmlns="http://marklogic.com/xdmp/tde">
<context>/scope/item/transaction</context>
<rows>
<row>
<schema-name>main</schema-name>
<view-name>transactions</view-name>
<columns>
<column>
<name>type</name>
<scalar-type>string</scalar-type>
<val>type</val>
</column>
</columns>
</row>
</rows>
</template>
return tde:template-insert("Transactions.xml", $transactions)
那么我们在这里做什么?我们将上下文指定为 /scope/item/transaction
,因为您在行定义中指定的列 type
位于这些元素之下。加载此模板将允许您 运行 SQL 语句 SELECT * FROM transactions;
您好,我正在使用 MarkLogic 9.0,并且在 ML 和 XML 方面具有初学者水平的经验。我已成功遵循 MarkLogic SQL Guide 并希望在现实世界中使用它并从事务性 xml 文件中提取类型元素。但是在我创建的视图中 returns 是一个空结果。我认为这与 xsd 和 xsi 有关。但是正如我之前提到的,我处于初学者水平,我不知道如何解决这个问题。
以下文字描述了重现问题的场景。
我将 3500 个 xml 文档加载到 SQL 数据(具有三重存储索引)我还创建了一个与 SQL 数据相关的 SQL 模式数据库指南中描述的数据库。所有 XML 文档都具有类似于以下示例的结构:
<?xml version="1.0" encoding="UTF-8"?>
<scope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<item>
<transaction>
<type>CI</type>
<sscc>00000379461100000007</sscc>
<location>4260210630688</location>
<device>VISTALINK.004</device>
<date>2017-04-25</date>
<time>01:22:20</time>
<gmtOffset>+02:00</gmtOffset>
<actorId>155081</actorId>
</transaction>
<order>
<orderNumber>3794611</orderNumber>
</order>
</item>
</scope>
使用这样的 URI(所有文档都具有相似的结构):
/transactions/2017-04-25_01-22-20_3794611_00000379461100000007_CI.xml
现在我创建了一个具有以下结构的模板:
xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde"
at "/MarkLogic/tde.xqy";
let $transactions :=
<template xmlns="http://marklogic.com/xdmp/tde">
<context>/transactions</context>
<rows>
<row>
<schema-name>main</schema-name>
<view-name>transactions</view-name>
<columns>
<column>
<name>type</name>
<scalar-type>string</scalar-type>
<val>type</val>
</column>
</columns>
</row>
</rows>
</template>
return tde:template-insert("Transactions.xml", $transactions)
我也将上下文更改为:
<context>item</context>
和 /项目
它没有return任何错误所以我认为结果会很好
当我在 SQL 控制台中执行以下语句时,它 return 是一个空结果:
select * from transactions;
当我验证上面的模板时,return得到以下结果:
<map:map xmlns:map="http://marklogic.com/xdmp/map" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<map:entry key="valid">
<map:value xsi:type="xs:boolean">false</map:value>
</map:entry>
<map:entry key="error">
<map:value xsi:type="xs:string">TDE-INVALIDTEMPLATENODE</map:value>
</map:entry>
<map:entry key="message">
<map:value xsi:type="xs:string">TDE-INVALIDTEMPLATENODE: Invalid extraction template node: /tde:template/tde:rows/text()</map:value>
</map:entry>
</map:map>
所以通过验证的错误是:
Invalid extraction template node: /tde:template/tde:rows/text()
Invalid extraction template node:
/tde:template/tde:rows/text()
有人知道我该如何解决这个问题吗?
问题出在您的上下文中。您已指定 <context>item</context>
,但根据您的示例文档,item
是 scope
的子项。因此,您的模板应如下所示:
xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde" at "/MarkLogic/tde.xqy";
let $transactions :=
<template xmlns="http://marklogic.com/xdmp/tde">
<context>/scope/item/transaction</context>
<rows>
<row>
<schema-name>main</schema-name>
<view-name>transactions</view-name>
<columns>
<column>
<name>type</name>
<scalar-type>string</scalar-type>
<val>type</val>
</column>
</columns>
</row>
</rows>
</template>
return tde:template-insert("Transactions.xml", $transactions)
那么我们在这里做什么?我们将上下文指定为 /scope/item/transaction
,因为您在行定义中指定的列 type
位于这些元素之下。加载此模板将允许您 运行 SQL 语句 SELECT * FROM transactions;