XQuery-如何使用以下数据创建映射



我有以下数据:

<courses>
    <course subjectId="3" name="World War II"/>
    <course subjectId="5" name="Algebra I"/>
    <course subjectId="5" name="Statistics"/>
    <course subjectId="15" name="Physics"/>
    <course subjectId="5" name="Algebra II"/>
    <course subjectId="15" name="Chemistry"/>
</courses>

我希望创建一个xpath脚本,以便它生成以下映射:

map {
   '3': ('<course subjectId="3" name="World War II"/>'),
   '5': ('<course subjectId="5" name="Algebra I"/>', '<course subjectId="5" name="Algebra II"/>', '<course subjectId="5" name="Statistics"/>'),
   '15': ('<course subjectId="15" name="Physics"/>', '<course subjectId="15" name="Chemistry"/>')
}

我该怎么做?

要使用映射,需要XPath 3.1、XQuery 3.1或XSLT 3.0。

纯XPath3.1解决方案是

map:merge(
  for $x in distinct-values(course/@subjectId) 
  return map{$x : 
             course[@subjectId = $x] ! 
               serialize(., map{'method':'xml', 'omit-xml-declaration':true()})
             }) 

但我不确定您为什么要创建一个包含序列化为XML字符串的节点的映射。将节点本身放在映射值中似乎更有用。

===修订答案===

在您的评论中,您已经更改了您的要求,以便

  • 您想要的是XQuery解决方案,而不是XPath
  • 您希望映射包含相关节点,而不是节点的XML序列化

这意味着你可以做:

map:merge(
  for $x in course
  group by $id := $x/@subjectId 
  return map{$id : $x})

(未测试:请告诉我们它是否有效!注意,它需要XQuery 3.1)

相关内容

  • 没有找到相关文章

最新更新