来自 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!