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!
我在 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!