如何仅用XPath 3.0的sort函数排序元素序列?
没问题,我来帮你搞定纯XPath 3.0对<Appointment>元素序列排序的需求!不用XQuery或XSLT,只用XPath就能实现,我给你拆解清楚用法:
首先先明确XPath 3.0的sort()函数核心语法:
sort($要排序的序列 as item()*, $生成排序键的函数 as function(item()) as xs:anyAtomicType*, $排序选项 as map(*)?) as item()*
结合你给出的XML结构,我给你几个实用的排序例子:
1. 按Appointment的id属性升序排序
把id属性转成整数类型(避免字符串排序的坑,比如"11"和"2"字符串排序会让"11"排在"2"前面):
sort(/AppointmentList/Appointment, function($appt) { xs:integer($appt/@id) })
2. 按Start子元素的date属性升序排序
把date转成xs:date类型,确保按日期的时间逻辑排序,而不是字符串顺序:
sort(/AppointmentList/Appointment, function($appt) { xs:date($appt/Start/@date) })
3. 降序排序(比如按创建日期倒序)
如果需要降序,直接在第三个参数里传入排序选项map:
sort(/AppointmentList/Appointment, function($appt) { xs:date($appt/@creationDate) }, map{'order': 'descending'})
关键注意点
- 一定要把排序键转换成对应的原子类型(比如
xs:integer、xs:date),不要直接用字符串值,否则会出现不符合预期的排序结果(比如日期字符串"2018-10-01"和"2018-09-01"字符串排序会让前者在前,但实际日期后者更早)。 - 如果需要更复杂的排序规则(比如大小写不敏感的字符串排序),可以在第三个参数的map里添加
collation选项,比如:
sort(/AppointmentList/Appointment, function($appt) { $appt/@creatorID }, map{'collation': 'http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive'})
你可以用支持XPath 3.0的工具(比如Saxon XPath命令行、XMLSpy等)直接测试这些表达式,就能看到排序后的<Appointment>序列啦!
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

