我有以下数据:
<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)