return all based on a condition.

Hi I am new to XQuery and want to know whether I can return all the nodes in the xml file based on a condition.
For eg:

{
FOR $b IN document(“bib.xml”)/bib/book
WHERE $b/publisher = “Addison-Wesley”
RETURN

{ $b/title }

}


This XQuery returns only the book node and its child node. What I need is that it should return all the nodes in bib.xml based on the condition.

Thank You
Kulkarni

I missed a thing, what I am expecting from the return statement is all the node/text pair values.
For eg: JK Rowling
then XQuery should return author and JK Rowling
Is it possible to get the node/text values of the childnodes of each node if it has any?

Thank You
Kulkarni

I’m not 100% sure what your expecting to be returned. If you just want all the elements which match your criteria - plus the full tree structure below them, then you can just do:-


{
FOR $b IN document(“bib.xml”)/bib/book
WHERE $b/publisher = “Addison-Wesley”
RETURN
$b


Hope that helps

Mike Ball

Hi Thanx for the reply, thats the part of the answer I required, Thanx. But can I just the get the element name and the text for each node/child node in the document?

JK Rowling

author = JK Rowling

If you want to return all the books that satisfy the condition, write:


{
for $b in document(“bib.xml”)/bib/book
where $b/publisher = “Addison-Wesley”
return $b
}


I hope I’ve interpreted your requirements correctly, if not, it helps if you explain what you want the output to be.

Michael Kay

Actually there’s a simpler way of writing this:


{
document(“bib.xml”)/bib/book
[publisher = “Addison-Wesley”]
}

Hello there,

to get a result like “author = JK Rowling” you could use something like this in the query:

   ...
   return 
      <book>
         {local-name($b/author)} = {$b/author/text()}
      </book>
   ...


I hope that helps (rather than confuses matters!),
Trevor.

Thanx Trevor,
I used your code snippet and I was able to see
author = JK Rowling
as the output.
The snippet displays only the author element, Can you please tell me how I can get all the elements in a document including the child elements along with the text?
And without the tag. Thanx again for ur solution.
for eg:

TCP/IP Illustrated

Stevens
W.

Addison-Wesley
65.95


Result
Year=1994
title = TCP/IP Illus…
Author =
last = Stevens
first W.

If you want to do this completely generically, you need to write a recursive function. That’s beyond the subset Tamino currently offers. The function would look something like this:

define function show($e as element()) as xs:string {
string-join (
(name($e), “=”,
if ($e/)
then for $c in $e/
show($c)
else string($e)
), “”)
}

You would need some refinement on that to get all the spacing and indentation right.

XQuery isn’t really designed for presentation tasks such as this, it’s more of a job for XSLT really. Use XQuery to get the data you want from the XML database, use XSLT to format it for display.

Michael Kay