XPath 1.0从XML获得最高日期

时间:2012-12-18 12:41:12

标签: xpath

在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日

虽然我只期待第二个

2 个答案:

答案 0 :(得分:0)

使用单个XPath 1.0表达式无法确定,因为

  1. 在XPath 1.0中,字符串没有<>运算符。

  2. 虽然可以使用translate()从上下文节点中删除连字符,但是在单个XPath 1.0表达式中不可能将其与所有其他值进行比较,每个值都经过相同的操作翻译。

  3. 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]