JSON 上的 MarkLogic XPath 在 属性 名称中带有“@”符号

MarkLogic XPath on JSON with "@" symbol in property name

我在 MarkLogic 中处理一些 JSON-LD 数据,在 属性 带有“@”符号的名称上使用 XPath 时遇到问题。例如:

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

我的目标是在类型为 "News" 时检索标题。我知道“@”在 XPath 中被保留来表示属性,所以下面的内容应该不起作用。

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

使用 xdmp.encodeForNCName 函数,我看到“@”符号在 JSON 表示中表示为 _40_。但是还是不行。

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

这是肮脏的解决方案。

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

我知道您正在使用 json,但我只是检查了 html 中具有相似属性和值组合的 xpath。您可以看到 xpath 同时考虑了属性名称和值(因为它没有选择具有相同名称但值不同的其他节点)。

您可以在谓词中测试 name()

doc.xpath('.[*[contains(name(), "@type")] = "News"]/title')

虽然使用 fn:name() 也可以,但正如其他答案所建议的那样,您也可以直接在 MarkLogic XPath 中寻址具有有趣拼写的节点。可能偏离官方 XPath 标准本身,但 MarkLogic 允许编写如下表达式:

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

对于包含空格等的 JSON 属性非常有用..

HTH!