将同名的 XML 元素转换为同名的 JSON 属性

wst*_*wst 3 json xquery marklogic marklogic-8

同名的 XML 元素和 JSON 属性可能是同级元素。IE:

<container>
  <value>value1</value>
  <value>value2</value>
</container>
Run Code Online (Sandbox Code Playgroud)

object-node {
  "value" : "value1",
  "value" : "value2"
}
Run Code Online (Sandbox Code Playgroud)

两者都是有效的,但我还没有找到一种有效的方法将一个转换为另一个。在构造函数中动态构建属性是无效的object-node,即:

object-node {
  for $v in $values
  return 'value' : $v
}
Run Code Online (Sandbox Code Playgroud)

使用映射不起作用,因为重复的键名称已折叠:

xdmp:to-json(map:new((
  map:entry("value", "value1"), 
  map:entry("value", "value2")))
  )

=> {"value":"value2"}
Run Code Online (Sandbox Code Playgroud)

当使用 时json:object,最后一个键值会被重复:

json:object(<json:object>
  <json:entry key="value">
    <json:value>value1</json:value>
  </json:entry>
  <json:entry key="value">
    <json:value>value2</json:value>
  </json:entry>
</json:object>)

=> {"value":"value2", "value":"value2"}
Run Code Online (Sandbox Code Playgroud)

使用运算符连接映射+更好,但它将重复的键合并为具有值数组 ( {"value":["value1", "value2"]}) 的单个键,这仍然不是我想要的。有没有办法在 XQuery 中动态构建同名的同级 JSON 属性?

Mic*_*Kay 5

您的 JSON 示例:

object-node {
  "value" : "value1",
  "value" : "value2"
}
Run Code Online (Sandbox Code Playgroud)

并不真正有效:或者无论如何,最好避免它。RFC 7159 说:

当对象内的名称不唯一时,接收此类对象的软件的行为是不可预测的。许多实现仅报告姓/值对。其他实现报告错误或无法解析对象,而某些实现报告所有名称/值对,包括重复项。