Значения MarkLogic TDE Xpath из строкового массива JSON - PullRequest
3 голосов
/ 30 октября 2019

Я хочу построить ade с строкой с идентификатором и каждым значением массива в исходном документе.

Я получаю строку для каждого элемента, но значения равны нулю и игнорируются.

Кажется, если контекст установлен на что-либо, кроме массива, который работает ../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"
                }
            }
        }
    ]
    }

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Выражение /node() для столбца type попытается получить дочерние узлы текстового узла, содержащего ваш тип, но у текстового узла нет дочерних узлов. data() или . более уместно.

Выражение ../uri для столбца uri не поднимается вверх по дереву достаточно высоко. Полный XPath MarkLogic для получения значений вашего типа будет /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!

0 голосов
/ 30 октября 2019

Я думаю, что проблема здесь: "val":"/node()",. Вы даете путь, который начинается с корня, а не узла контекста. Попробуйте вместо этого:

"val":".",
...