2012-01-19 418 views
1

這是我的XML片段的XPath - 從母體中獲取價值最高的節點值

<FinancialSummary> 
      <SummaryDate format="YYYYMMDD">20111231</SummaryDate> 
      <Revenue currency="EUR">1249164523</Revenue> 
    </FinancialSummary> 
    <FinancialSummary> 
      <SummaryDate format="YYYYMMDD">201</SummaryDate> 
      <Revenue currency="EUR">1242344523</Revenue> 
    </FinancialSummary> 
    <FinancialSummary> 
      <SummaryDate format="YYYYMMDD">20091231</SummaryDate> 
      <Revenue currency="EUR">324900932</Revenue> 
    </FinancialSummary> 

林試圖從收入節點financialsummary標籤內的最高數字summarydate值的節點內容。

/FinancialSummary[SummaryDate = '20111231']/Revenue 

這個XPath返回正確= 1249164523

max(/FinancialSummary/SummaryDate) 

這個XPath返回正確= 20111231

然而,當我嘗試都沒有結合返回

/FinancialSummary[SummaryDate = max(/FinancialSummary/SummaryDate)]/Revenue 

有什麼我失蹤了?這個難題的解決方案是什麼?

額外的信息:我試過包含的,而不是「=」,但與

+2

在我看來,在這裏失蹤的東西。你的第一個表達式以'/'開頭,XML文檔只能有一個根。你的最後一個表達式也包含這個斜槓,意味着它只能返回一件事,即第一個也是唯一的文檔根節點的Revenue元素,但前提條件是它滿足謂詞。同樣,你的中間表達似乎也不可能返回正確的數據。你確定這是整個背景嗎? – Abel

+0

@Abel,我同意你說的話,但術語混亂。只能有一個「根」,但這是指根節點('/'),而不是最外層的元素。因此「根節點的收入元素」沒有意義......根節點的唯一子元素是FinancialSummary元素。您顯然是指最外層元素的Revenue元素子元素。 – LarsH

+0

@LarsH:只能有一個根,我們同意。在示例XML中有三個「根」,這是無效的。謂詞'[SummaryDate = max(/ FinancialSummary/SummaryDate)]'選擇了一些東西,但沒有選擇:只有一個根,沒有選擇。我同意我的措辭含糊不清。我的意思是說_「表達式查找根節點(FinancialSummary)的子節點的所有Revenue元素,前提是根節點滿足謂詞」_「。 – Abel

回答

1

沒有運氣,我認爲這個表達式回答你的問題:

FinancialSummary[SummaryDate = max(./parent::*/FinancialSummary/SummaryDate)]/Revenue 

的情況下在你的謂詞是FinancialSummary。你必須在樹上起牀才能找到其他人。如果某些節點具有相同的日期,則此表達式可以返回多個節點。

編輯

我刪除了第一個斜槓。 結果:您必須位於正確的上下文(FinancialSummary的父級)才能啓動此XPath查詢。

+0

他的表達式以'/'開頭,這就是文檔的根。從當前節點開始,他應該寫'。/'代替。但是您的表達仍然可以是一個解決方案,因爲它搜索文檔的任何第一個孩子。 – Abel

+0

@Abel:對!我會糾正的。謝謝。 –

+3

請注意'./parent :: * /'相當於'../'。 – LarsH

3

這工作(通知//而不是/和謂語轉移到上下文父):

//FinancialSummary[SummaryDate=max(../FinancialSummary/SummaryDate)]/Revenue 

然而,這將是更好(即更嚴格和更高效的),以提供直接路徑到FinancialSummary這是基於您的文檔的實際結構。在示例XML

問題和建議的解決方案:

  • 您已經提供了沒有很好地形成一個XML樣本
  • 你的表情開始在根目錄(/),但實際的文件大概會不含有根FinancialSummary(因爲它似乎那些元件進一步向下在樹)
+1

+1這正是我的意思(請參閱我的評論)。這看起來更像一個合適的解決方案。實際上,'//'在大多數處理器上都是代碼異味,並且速度很慢,應該由OP直接路徑的解決方案刪除。 – Abel

0

不知當兩個XPath合併它不工作的原因是,在第一種情況下,您將SummaryDate與字符串'20111231'進行比較,但在第二種情況下,您將SummaryDate與max(...)之間的數字進行比較。

要測試此,嘗試

/FinancialSummary[SummaryDate = 
    string(max(/FinancialSummary/SummaryDate))]/Revenue 

而且,我同意@Able和@lwburk,這將是減少混亂,如果你不嘗試,以治療病態的XML樣本(多個頂級元素),就好像它是一個實際的XML文檔(使用「/ FinancialSummary/...」解決)。我想你只是試圖簡短一點,只說出你認爲與問題相關的內容。但它顯然是不正確的,它引發了各種警報。對此的澄清將有所幫助。