2012-12-18 38 views
1

在一個xml文件中,我有許多日期字段。我需要找出哪一個是最高價值。不幸的是我不得不使用xpath 1.0,所以不容易做到這一點。xpath 1.0從XML中獲取最高日期

我開始了這個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我與GOT工作日期字段是這樣的:

<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來刪除m inus標誌。然而,我使用Xpath和Oxygen XML編輯器的應用程序告訴我concat和substring沒有Xpath 1.0函數(儘管幾頁告訴我他們是......)

當我告訴氧氣它是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-01 -03 2014-01-03

雖然我只希望第二個

回答

0

這不能與一個XPath來確定1.0表達式因爲

  1. 在XPath 1.0沒有一個<>運算符用於字符串。

  2. 儘管可以使用translate()從上下文節點中刪除連字符,但單個XPath 1.0表達式不可能將其與所有其他值進行比較,其中每個值都經歷了相同的轉換。

XPath 2。0溶液

max(/*/*/xs:date(.)) 
+0

謝謝,我相信你是對的,嘗試了很多我在網上找到的不同解決方案,但是沒有人使用Xpath 1.0。猜猜我必須向軟件供應商詢問實現Xpath 2的版本 – ErikL

+0

@ErikL,不客氣。您可以實現自己的擴展功能,或者更好的,開始使用XPath 2.0。 –

-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] 
+0

很好,但它在XPath 2,但使用XPath 1 I只是得到5次的結果(所有日期) – ErikL

+1

貝尼,在XPath 1.0沒有'>'或'<'對字符串comparisson - 因此你在這個答案中說的是不正確的。 –