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(),'-','')
)]
しかし、何らかの理由で、これは 2 つの値を生成します。
2013-01-03 2014-01-03
私は2番目のものだけを期待しますが