MarkLogic XPath в JSON с символом «@» в имени свойства - PullRequest
2 голосов
/ 22 мая 2019

Я имею дело с некоторыми данными JSON-LD в MarkLogic и не могу использовать XPath для имен свойств с символом "@". Например:

{
  "@type": "News",
  "title": "some title",
  "description": "some description"
}

Моя цель - получить заголовок, если указан тип «Новости». Я понимаю, что "@" зарезервирован для представления атрибута в XPath, поэтому что-то ниже не должно работать.

doc.xpath('.[@type="News"]/title')

С помощью функции xdmp.encodeForNCName я вижу символ "@", представленный как _40_ в представлении JSON. Но это все еще не работает.

doc.xpath('.[_40_type="News"]/title')

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Вы можете проверить name() в предикате:

doc.xpath('.[*[contains(name(), "@type")] = "News"]/title')
1 голос
/ 23 мая 2019

Хотя использование fn:name() также будет работать, как предлагают другие ответы, вы также можете обращаться к узлам с забавным написанием непосредственно в MarkLogic XPath. Возможно, это отклонение от самого официального стандарта XPath, но MarkLogic позволяет писать выражения вроде:

doc.xpath('node("@type")[. eq "News"]/title'

Очень полезно для свойств JSON, содержащих пробелы и тому подобное ..

НТН!

0 голосов
/ 22 мая 2019

Вот грязное решение.

 .[@*[name() = '@type']][@*='News']/title

Я знаю, что вы работаете с json, но я только что проверил xpath в html с похожей комбинацией атрибутов и значений. Вы можете видеть, что xpath рассматривал как имя атрибута, так и значение (поскольку он не выбирает другой узел с тем же именем, но с другим значением).

enter image description here

...