2011-04-30 201 views
2

我有一個包含圖書館書籍的xml。我想列出所有沒有簽出的書籍。所以,方法是獲取所有書籍,如果書籍ID與已簽出的書籍ID匹配,則不要列出它,否則將其列出。xquery for循環問題

在java或其他語言中,我會做一個雙循環和元素循環是否有類似的xQuery?

<book asin="0201100886" created="128135928" lastLookupTime="128135928"> 
    <uuid>BA57A934-6CDC-11D9-830B-000393D3DE16</uuid> 
    <title>Compilers</title> 
    <authors> 
    <author>Alfred V. Aho</author> 
    <author>Ravi Sethi</author> 
    <author>Jeffrey D. Ullman</author> 
    </authors> 
    <publisher>Addison Wesley</publisher> 
    <published>1986-01-01</published> 
    <price>102.00</price> 
    <purchaseDate>2005-01-22</purchaseDate> 
</book> 

<borrowers> 
    <borrower id="1"> 
    <name> John Doe </name> 
    <phone> 555-1212 </phone> 
    <borrowed> 
     <book asin="0138613370"/> 
     <book asin="0122513363"/> 
    </borrowed> 
    </borrower> 
</borrowers> 
+0

你應該發佈一個你正在嘗試做的例子。這聽起來像一個簡單的XPath將返回你所需要的,但很難說沒有一個例子。 – 2011-04-30 05:05:40

+0

<書ASIN = 「0201100886」 \t創建= 「128135928」 \t lastLookupTime = 「128135928」> BA57A934-6CDC-11D9-830B-000393D3DE16 編譯器 \t 阿爾弗雷德V.阿霍 \t 拉維·塞特 \t 傑弗裏·烏爾曼 阿狄森韋斯利 1986年1月1日 102.00 <而purchaseDate> 2005-01-22 zach 2011-04-30 05:11:57

+0

<借款人ID = 「1」> John Doe的 555-1212 \t <書ASIN = 「0138613370」/> \t <書ASIN = 「0122513363」/> zach 2011-04-30 05:12:26

回答

2

在Java或其他語言,我會做一個雙重for循環並遍歷所有的元素是有使用XQuery類似的東西?

XQuery還有一個「for」循環/子句。

這裏有幾個例子。

第一個例子是,如果<book><borrowers>在不同的文件:

的books.xml

(請注意,第二本書具有一個asin在borrowers.xml文件相匹配的asin 。)

<books> 
    <book asin="0201100886" created="128135928" lastLookupTime="128135928"> 
    <uuid>BA57A934-6CDC-11D9-830B-000393D3DE16</uuid> 
    <title>Compilers</title> 
    <authors> 
     <author>Alfred V. Aho</author> 
     <author>Ravi Sethi</author> 
     <author>Jeffrey D. Ullman</author> 
    </authors> 
    <publisher>Addison Wesley</publisher> 
    <published>1986-01-01</published> 
    <price>102.00</price> 
    <purchaseDate>2005-01-22</purchaseDate> 
    </book> 
    <book asin="DEVNULL" created="128135928" lastLookupTime="128135928"> 
    <uuid>98374982739847298347928374</uuid> 
    <title>Test Book</title> 
    <authors> 
     <author>DevNull</author> 
    </authors> 
    <publisher>Stackoverflow</publisher> 
    <published>2011-04-29</published> 
    <price>FREE</price> 
    <purchaseDate>2011-04-29</purchaseDate> 
    </book> 
</books> 

borrowers.xml

<borrowers> 
    <borrower id="1"> 
    <name> John Doe </name> 
    <phone> 555-1212 </phone> 
    <borrowed> 
     <book asin="0138613370"/> 
     <book asin="0122513363"/> 
     <book asin="DEVNULL"/> 
    </borrowed> 
    </borrower> 
</borrowers> 

的XQuery

<availableBooks> 
{ 
let $borrowed := doc("borrowers.xml")/borrowers/borrower/borrowed/book 
for $book in doc("books.xml")/books/book 
    where not($borrowed[@asin = $book/@asin]) 
    return $book 
} 
</availableBooks> 

結果

<availableBooks> 
    <book asin="0201100886" created="128135928" lastLookupTime="128135928"> 
     <uuid>BA57A934-6CDC-11D9-830B-000393D3DE16</uuid> 
     <title>Compilers</title> 
     <authors> 
     <author>Alfred V. Aho</author> 
     <author>Ravi Sethi</author> 
     <author>Jeffrey D. Ullman</author> 
     </authors> 
     <publisher>Addison Wesley</publisher> 
     <published>1986-01-01</published> 
     <price>102.00</price> 
     <purchaseDate>2005-01-22</purchaseDate> 
    </book> 
</availableBooks> 

下面是與<book><borrower>數據組合在單個文件中的另一個示例:

(注意:結果是與上述相同。)

combined.xml

<library> 
    <books> 
    <book asin="0201100886" created="128135928" lastLookupTime="128135928"> 
     <uuid>BA57A934-6CDC-11D9-830B-000393D3DE16</uuid> 
     <title>Compilers</title> 
     <authors> 
     <author>Alfred V. Aho</author> 
     <author>Ravi Sethi</author> 
     <author>Jeffrey D. Ullman</author> 
     </authors> 
     <publisher>Addison Wesley</publisher> 
     <published>1986-01-01</published> 
     <price>102.00</price> 
     <purchaseDate>2005-01-22</purchaseDate> 
    </book> 
    <book asin="DEVNULL" created="128135928" lastLookupTime="128135928"> 
     <uuid>98374982739847298347928374</uuid> 
     <title>Test Book</title> 
     <authors> 
     <author>DevNull</author> 
     </authors> 
     <publisher>Stackoverflow</publisher> 
     <published>2011-04-29</published> 
     <price>FREE</price> 
     <purchaseDate>2011-04-29</purchaseDate> 
    </book> 
    </books> 
    <borrowers> 
    <borrower id="1"> 
     <name> John Doe </name> 
     <phone> 555-1212 </phone> 
     <borrowed> 
     <book asin="0138613370"/> 
     <book asin="0122513363"/> 
     <book asin="DEVNULL"/> 
     </borrowed> 
    </borrower> 
    </borrowers> 
</library> 

的XQuery

<availableBooks> 
{ 
for $library in doc("combined.xml")/library 
    for $book in $library/books/book 
    let $borrowed := $library/borrowers/borrower/borrowed/book 
    where not($borrowed[@asin = $book/@asin]) 
    return $book 
} 
</availableBooks> 
+0

你做出了一個很好的答案,可惜現在我們看到了,得到我的+1 – 2016-03-31 21:11:51

1

假設<book><borrower>和元件爲<library>元素的子元素(使XML良好形成),它只是

/library/book[not(@asin = /library/borrowers/borrower/book/@asin)] 
+0

+1爲一個完美的XPath-one-liner答案。 – 2011-05-01 17:41:03