2010-01-27 28 views
4

我正在嘗試學習XPath,並且在做嵌套搜索時遇到了麻煩(使用contains)。xpath:包含()一組答案

具體來說,我得到了以下問題:

有作者的列表,以及一個書單,根據下面的DTD:

<!ELEMENT db1 (book*, author*)> 
<!ELEMENT book (title)> 
<!ATTLIST book 
    bid ID #REQUIRED 
    authors IDREFS #REQUIRED 
> 
<!ELEMENT title (#PCDATA)> 
<!ELEMENT author (#PCDATA)> 
<!ATTLIST author 
    aid ID #REQUIRED 
> 

編寫返回XPath表達式寫書的作者數量。有可能假設沒有兩個作者ID相互包含。

我嘗試了很多事情,但我總是收到「包含的項目太多」的錯誤。 我嘗試運行是這樣的:

//author/@aid[contains(//book/@authors/string(.), string(.))] 

我使用下面的XML文件爲例:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE db1 SYSTEM "C:\blabla\db1.dtd"> 
<db1> 
<book authors="a1 a3 a4" bid="b1"> 
<title>Book 1</title> 
</book> 
<book authors="a1 a2 a3" bid="b2"> 
<title>Book 2</title> 
</book> 
<book authors="a4" bid="b3"> 
<title>Book 3</title> 
</book> 
<author aid="a1"></author> 
<author aid="a91"></author> 
<author aid="a2"></author> 
<author aid="a88"></author> 
<author aid="a3"></author> 
<author aid="a4"></author> 
<author aid="a5"></author> 
<author aid="a6"></author> 

</db1> 

預期的答案應該是

a1 a2 a3 a4 

有什麼建議?

謝謝。

+0

您能否提供您正在運行的XML文檔和代碼來測試XPath表達式? – 2010-01-27 19:38:59

+0

@AJ,我添加了我正在使用的示例。希望它有幫助.... – Anna 2010-01-27 20:07:10

+0

解釋預期的答案?你想從bid = 1返回@authors嗎?或者您是否想要返回具有相應書籍的作者的唯一列表? – 2010-01-28 07:37:34

回答

2

我找到了我正在尋找的答案。實際上這並不難,只需要熟悉XPath的'id'特性。

XPath查詢這個是: count(id(//book/@authors))

作者列表給出作爲id(//book/@authors)。請注意,這個XQuery的(只,而不是名稱)返回完整的XML:

<author aid="a1"/> 
<author aid="a2"/> 
<author aid="a3"/> 
<author aid="a4"/> 

reference

功能contains在這種情況下不適用,但幸運的是,它也不是真的有必要。

id函數通過其唯一ID選擇元素。當id的參數是node-set類型時,則結果是將id應用到參數節點集中每個節點的字符串值的結果的並集。當id的參數具有任何其他類型時,參數將轉換爲字符串,就像通過調用字符串函數一樣;該字符串被拆分爲一個以空格分隔的令牌列表(空格是與生產S匹配的任何字符序列);結果是包含與上下文節點相同的文檔中的元素的節點集具有唯一ID等於列表中的任何標記。

+0

該查詢不會返回預期的結果。那是怎麼回事? – 2010-01-28 07:34:05

+0

我編輯了一下這個例子,說明了我的想法。希望現在不那麼困惑。 – Anna 2010-01-28 09:02:01

+0

很高興你明白了這一點!這不是我採用它的方向......但它對我來說完全適合你。我使用libxml2在python中構建了一個簡單的測試工具,如果有人想看到它,我可以發佈它... – 2010-01-28 14:31:03