0

我有以下数据:

<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"/>')
}

我怎样才能做到这一点?

4

1 回答 1

3

要使用地图,您需要 XPath 3.1、XQuery 3.1 或 XSLT 3.0。

纯 XPath 3.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)

于 2015-12-01T09:05:54.853 回答