如何使用XPath提取XML中最新创建节点的对应元素值?
XPath提取最新创建日期对应ID的解决方案
直接对Document_creation_date字符串做大小比较失效的核心原因是XPath默认不会自动识别dd.MM.yyyy HH:mm格式的字符串为日期类型,默认字符串比较是按字符ASCII码的字典序对比,和实际时间先后顺序不一致。
方案1:XPath 2.0及以上版本(推荐,逻辑清晰)
利用XPath 2.0内置的日期类型转换能力,先把自定义格式的日期拼接为ISO标准日期格式再做比较:
/root/JsonData[not( xs:dateTime( concat( substring(Document_creation_date,7,4), '-', substring(Document_creation_date,4,2), '-', substring(Document_creation_date,1,2), 'T', substring(Document_creation_date,12,5) ) ) < xs:dateTime( concat( substring(../JsonData/Document_creation_date,7,4), '-', substring(../JsonData/Document_creation_date,4,2), '-', substring(../JsonData/Document_creation_date,1,2), 'T', substring(../JsonData/Document_creation_date,12,5) ) ) )]/Dokument_ID
方案2:XPath 1.0兼容方案(适配旧解析器)
不需要依赖日期类型支持,直接把日期字段拆解后拼接为可直接比较的整数(格式为YYYYMMDDHHmm,数值越大代表时间越新):
/root/JsonData[not( (substring(Document_creation_date,7,4)*100000000 + substring(Document_creation_date,4,2)*1000000 + substring(Document_creation_date,1,2)*10000 + substring(Document_creation_date,12,2)*100 + substring(Document_creation_date,15,2)) < (substring(../JsonData/Document_creation_date,7,4)*100000000 + substring(../JsonData/Document_creation_date,4,2)*1000000 + substring(../JsonData/Document_creation_date,1,2)*10000 + substring(../JsonData/Document_creation_date,12,2)*100 + substring(../JsonData/Document_creation_date,15,2)) )]/Dokument_ID
两种方案均会返回示例XML中最新日期对应的ID:22f14c7b。
内容的提问来源于stack exchange,提问作者Velev
相关产品推荐
相关产品推荐

