1

在 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 一起使用以及我如何解决这个问题?

编辑:

我以为我通过使用 translate 来删除减号越来越近了:

/root/value[not(translate(text(),'-','') <= translate(preceding-sibling::value/text(),'-','')) and not(translate(text(),'-','') <=translate(following-sibling::value/text(),'-','')
)]

但出于某种原因,这会产生两个值:

2013-01-03 2014-01-03

虽然我只期待第二个

4

2 回答 2

0

这不能用单个 XPath 1.0 表达式来确定,因为

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

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

XPath 2.0 解决方案

max(/*/*/xs:date(.))
于 2012-12-19T05:57:19.483 回答
-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]
于 2012-12-18T12:49:33.330 回答