来自 JSON 字符串数组的 MarkLogic TDE Xpath 值
MarkLogic TDE Xpath values from JSON string array
我想构建一个 tde,其中一行带有一个 id 和原始文档中数组的每个值。
我为每个元素获取一行,但这些值为空并被忽略。
似乎如果上下文设置为数组以外的任何内容,../uri 会起作用,但当上下文是数组时则不会。
除了简单的示例,我正在努力寻找 MarkLogic TDE 的好资源,
示例文档(片段)
"instance": {
"uri": "/A/Uri/of/some/type.json",
"types": [
"a",
"b",
"c"
]
}
模板
{
"template":{
"context":"/instance/types",
"collections":["Collection"],
"enabled" : true,
"rows":[
{
"schemaName":"namespace",
"viewName":"uri2types",
"columns":[
{
"name":"uri",
"scalarType":"anyURI",
"val":"../uri",
"nullable":true,
"invalidValues": "ignore"
}
,
{
"name":"type",
"scalarType":"string",
"val":"/node()",
"nullable":true,
"invalidValues": "ignore"
}
]
}
]
}
}
结果
{
"/A/Uri/of/some/type.json": [
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "1"
}
}
},
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "2"
}
}
},
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "3"
}
}
}
]
}
**Result Wanted**
{
"/A/Uri/of/some/type.json": [
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "1",
"uri":"/A/Uri/of/some/type.json":,
"type"="a"
}
}
},
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "2",
"uri":"/A/Uri/of/some/type.json":,
"type":"b"
}
}
},
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "3",
"uri":"/A/Uri/of/some/type.json":,
"type":"c"
}
}
}
]
}
我认为问题出在这里:"val":"/node()",
。您提供的路径从根开始,而不是从上下文节点开始。试试这个:
"val":".",
type
列的表达式 /node()
将尝试获取包含您的类型的文本节点的子节点,但文本节点没有任何子节点。 data()
或 .
更合适。
uri
列的表达式 ../uri
在树上的上升不够高。获取您的类型值的完整 MarkLogic XPath 将是 /object-node()/object-node('instance')/array-node('types')/text()
。您需要上升两层才能逃离周围的数组节点。它可以帮助将 /instance/types
重写为 /instance/array-node()/types
:
'use strict';
let json = xdmp.toJSON({
"instance": {
"uri": "/A/Uri/of/some/type.json",
"types": [
"a",
"b",
"c"
]
}
});
let tpl = xdmp.toJSON({
"template":{
"context":"/instance/array-node()/types",
"enabled" : true,
"rows":[
{
"schemaName":"namespace",
"viewName":"uri2types",
"columns":[
{
"name":"uri",
"scalarType":"anyURI",
"val":"../../uri",
"nullable":true,
"invalidValues": "ignore"
}
,
{
"name":"type",
"scalarType":"string",
"val":"data()",
"nullable":true,
"invalidValues": "ignore"
}
]
}
]
}
});
tde.validate([tpl]);
tde.nodeDataExtract([json], [tpl]);
HTH!
我想构建一个 tde,其中一行带有一个 id 和原始文档中数组的每个值。
我为每个元素获取一行,但这些值为空并被忽略。
似乎如果上下文设置为数组以外的任何内容,../uri 会起作用,但当上下文是数组时则不会。
除了简单的示例,我正在努力寻找 MarkLogic TDE 的好资源,
示例文档(片段)
"instance": {
"uri": "/A/Uri/of/some/type.json",
"types": [
"a",
"b",
"c"
]
}
模板
{
"template":{
"context":"/instance/types",
"collections":["Collection"],
"enabled" : true,
"rows":[
{
"schemaName":"namespace",
"viewName":"uri2types",
"columns":[
{
"name":"uri",
"scalarType":"anyURI",
"val":"../uri",
"nullable":true,
"invalidValues": "ignore"
}
,
{
"name":"type",
"scalarType":"string",
"val":"/node()",
"nullable":true,
"invalidValues": "ignore"
}
]
}
]
}
}
结果
{
"/A/Uri/of/some/type.json": [
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "1"
}
}
},
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "2"
}
}
},
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "3"
}
}
}
]
}
**Result Wanted**
{
"/A/Uri/of/some/type.json": [
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "1",
"uri":"/A/Uri/of/some/type.json":,
"type"="a"
}
}
},
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "2",
"uri":"/A/Uri/of/some/type.json":,
"type":"b"
}
}
},
{
"row": {
"schema": "namespace",
"view": "uri2types",
"data": {
"rownum": "3",
"uri":"/A/Uri/of/some/type.json":,
"type":"c"
}
}
}
]
}
我认为问题出在这里:"val":"/node()",
。您提供的路径从根开始,而不是从上下文节点开始。试试这个:
"val":".",
type
列的表达式 /node()
将尝试获取包含您的类型的文本节点的子节点,但文本节点没有任何子节点。 data()
或 .
更合适。
uri
列的表达式 ../uri
在树上的上升不够高。获取您的类型值的完整 MarkLogic XPath 将是 /object-node()/object-node('instance')/array-node('types')/text()
。您需要上升两层才能逃离周围的数组节点。它可以帮助将 /instance/types
重写为 /instance/array-node()/types
:
'use strict';
let json = xdmp.toJSON({
"instance": {
"uri": "/A/Uri/of/some/type.json",
"types": [
"a",
"b",
"c"
]
}
});
let tpl = xdmp.toJSON({
"template":{
"context":"/instance/array-node()/types",
"enabled" : true,
"rows":[
{
"schemaName":"namespace",
"viewName":"uri2types",
"columns":[
{
"name":"uri",
"scalarType":"anyURI",
"val":"../../uri",
"nullable":true,
"invalidValues": "ignore"
}
,
{
"name":"type",
"scalarType":"string",
"val":"data()",
"nullable":true,
"invalidValues": "ignore"
}
]
}
]
}
});
tde.validate([tpl]);
tde.nodeDataExtract([json], [tpl]);
HTH!