在XML文件中,我有许多日期字段。我需要找出哪一个是最高价值。不幸的是,我必须使用XPath 1.0,因此没有一种简单的方法可以做到。
我开始使用这个XML:
<root>
<value>20120103</value>
<value>20130103</value>
<value>20120101</value>
<value>20140103</value>
<value>20100103</value>
</root>
从这里,我可以使用这个xpath语句获得最高值:
/root/value[not(text() <= preceding-sibling::value/text()) and not(text() <=following-sibling::value/text
())]
然而,我正在使用的真正的XML有这样的日期字段:
<root>
<value>2012-01-03</value>
<value>2013-01-03</value>
<value>2012-01-01</value>
<value>2014-01-03</value>
<value>2010-01-03</value>
</root>
要执行相同的XPath,我必须使用substring和concat来删除减号。但是,我正在使用XPath和Oxygen XML编辑器的应用程序告诉我concat和substring没有Xpath 1.0函数(虽然有几页告诉我它们是......)
当我告诉Oxygen它是Xpath 2.0时,我可以用这个语句得到值:
/root/value[not(concat(concat(substring(text(),1,4),substring(text(),6,2)),substring(text(),9,2)) <= preceding-sibling::value/concat(concat(substring(text(),1,4),substring(text(),6,2)),substring(text(),9,2))) and not
(concat(concat(substring(text(),1,4),substring(text(),6,2)),substring(text(),9,2)) <=following-sibling::value/concat(concat(substring(text(),1,4),substring(text(),6,2)),substring(text(),9,2)))]
任何想法为什么它不能使用Xpath 1.0以及我如何解决这个问题?
编辑:
我以为我越来越接近使用翻译去除减号:
/root/value[not(translate(text(),'-','') <= translate(preceding-sibling::value/text(),'-','')) and not(translate(text(),'-','') <=translate(following-sibling::value/text(),'-','')
)]
但由于一个或另一个原因,这会产生两个值:
2013年1月3日 2014年1月3日
虽然我只期待第二个
答案 0 :(得分:0)
使用单个XPath 1.0表达式无法确定,因为:
在XPath 1.0中,字符串没有<
或>
运算符。
虽然可以使用translate()
从上下文节点中删除连字符,但是在单个XPath 1.0表达式中不可能将其与所有其他值进行比较,每个值都经过相同的操作翻译。
XPath 2.0解决方案:
max(/*/*/xs:date(.))
答案 1 :(得分:-1)
实际上,你的第一个XPath
/root/value[not(text() <= preceding-sibling::value/text()) and not(text() <=following-sibling::value/text())]
在两种情况下都可以正常工作。
只要格式为年,月,日订单,并带有前导零...
然而,如果有重复的日子,它将无效,所以更好地使用:
(/root/value[not(text() < preceding-sibling::value/text()) and not(text() < following-sibling::value/text())])[1]