2010-05-25 60 views
5

我有兩個XML文檔:的XPath - 查詢兩個XML文檔

XML1:

<Books> 
    <Book id="11"> 
      ....... 
      <AuthorName/> 
    </Book> 
    ...... 
</Books> 

XML2:

<Authors> 
    <Author> 
      <BookId>11</BookId> 
      <AuthorName>Smith</AuthorName> 
    </Author> 
</Authors> 

我試圖做到以下幾點:

獲取XML2/Author/AuthorName的值,其中XML1/Book/@ id等於XML2/Author/BookId。

XML2/Author/AuthorName[../BookId = XML1/Book/@id] 
+0

好問題(+1)。查看我的答案以獲取完整的XPath 1.o和XPath 2.x解決方案。 – 2010-05-25 13:00:34

回答

4

XPath 1.0表達式不能引用多個XML文檔,除非在託管語言中已經在XPath引擎的上下文中引用了其他文檔。例如,如果XSLT是託管語言,那麼它的document()函數可用於其託管的XPath引擎。

document($xml2Uri)/Authors/Author[BookId = $mainDoc/Books/Book/@id] 

待辦事項,即使是主XML文檔需要通過其他<xsl:variable>,這裏$mainDoc命名被引用。

document()函數僅在Xpath由XSLT託管時纔可用! Doc Brown的答覆中沒有提到這一點,並且誤導了讀者。

XPath 2.x表達式可能指代使用XPath 2.0的任何其他XML文檔doc()函數

for $doc in /, 
    $doc2 in doc(someUri) 
    return 
    $doc2/Authors/Author[BookId = $doc/Books/Book/@id] 
+0

我正在使用生命週期。這兩個xml文件都在內存中,我試圖只返回一個xml結果集。 XSLT一次只能轉換一個文件,(從我的理解)。 – Arnej65 2010-05-25 14:03:28

+0

@ Arnej65:XSLT轉換可以處理*許多* XML文檔 - 使用'document()'函數,臨時樹或作爲參數傳遞給轉換的文檔。 – 2010-05-25 14:37:12

+0

Livecycle中的xslt進程一次只能應用於一個文檔。我合併了結果,然後使用XSLT過濾最終輸出。感謝您的解決方案。 – Arnej65 2010-05-25 16:31:55

0

document功能是你的朋友,here是一個簡短的教程如何將多個輸入文件合併。

編輯:當然,只有當您在Xslt腳本中使用Xpath時纔有效。

+0

您是否知道'document()'函數僅在XSLT中可用?原來的問題是在XPath領域,XSLT不是預期的。 請更正您的答案。事實上,它在一般情況下不提供解決方案。 – 2010-05-25 13:04:58

+0

最後,我想從XML2中取出'authorname',並將值賦給XML1中的'authorname'。我正在開發Livecycle,並且可以使用xslt來完成transfor,但是如果您可以使用xpath來分配值,它們就具有工作流程活動。 – Arnej65 2010-05-25 13:20:15

+0

@ Arnej65:您無法「通過XSLT將值分配給XML1中的'authorname'」。 XSLT轉換不能改變它正在轉換的XML文檔 - 它只能創建一個新的XML文檔。 – 2010-05-25 13:25:04