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(),'-','')
)]

しかし、何らかの理由で、これは 2 つの値を生成します。

2013-01-03 2014-01-03

私は2番目のものだけを期待しますが

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 に答える