В Java или другом языке я бы сделал двойной цикл и цикл по элементам, есть ли что-то похожее с xQuery?
XQuery также имеет цикл / предложение for.
Вот несколько примеров.
Первый пример, если <book>
и <borrowers>
находятся в разных файлах:
books.xml
(Обратите внимание, что во второй книге asin
соответствует asin
в файле loaners.xml.)
<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>