[xquery-talk] XPath Issues in XQuery

Wei, Alice J. ajwei at indiana.edu
Sat Feb 16 08:31:50 PST 2008

Hi, David:

  Thanks for the explanation, but it looks like the code for the
<publication_information>Volume {$nodes/..//seriesStmt/idno[@type='volume'][1]}</publication_information>
is not returning any of the actual data. I am not sure if it is because of the structure of the XML. I took out the ../ and it still returns me with a tab instead of any data.

  I am wondering if offering information here on the actual hierarchy of my data would help.

  To get to the parent node of idno[@type='volume'] from the root is


   A portion of the structure in seriesStmt for most of the recorded data in my <publication_information>

<title level="journal">My Journal</title>
<idno type="volume"> 1 </idno>
<idno type="issue"> 1 </idno>

My revised XQuery:

let $ad := fn:collection("xmldb:exist://db/cbml")
let $volume := $ad//seriesStmt/idno[@type='volume'][1]
let $issue := $ad//seriesStmt/idno[@type='issue'][1]
let $journal := $ad//seriesStmt/title[@level='journal'][1]
let $ad2 := $ad//ad/head[contains(upper-case(.), 'MUSCLE')]
let $sorted_result:=
for $doc in distinct-values($ad2)
order by $doc
return $doc
for $r at $count in $sorted_result
let $nodes := $ad2[. = $r][1]
Showing Result: {$count} / {count($sorted_result)}
<publication_information>Volume {$nodes//seriesStmt/idno[@type='volume'][1]}, Issue {$nodes//seriesStmt/idno[@type='issue'][1]}</publication_information>

Would this make any difference on the code you provided me above?
Another question is, would I have to make adjustments to the let clause for $volume, $issue ad $journal?

Thanks for your help.

Alice Wei
MIS 2008
School of Library and Information Science
Indiana University Bloomington
ajwei at indiana.edu
From: David Carlisle [davidc at nag.co.uk]
Sent: Saturday, February 16, 2008 8:01 AM
To: Wei, Alice J.
Cc: talk at x-query.com
Subject: Re: [xquery-talk] XPath Issues in XQuery

It would have helped if yo'd supplied input file, but whatever.
your $volume, $issue and $journal variables apparently hod data for all
teh items. You apparently want to just return the volume and issue
for the node that you are processing. Confusingly you are using
suingular variable names for (eg) $volume even though this holds
multiple nodes, whereas you are using the plural name $nodes for the
$nodes variable which holds a single node.

without any input hard to check these paths but you seem to want
something like

<publication_information>Volume {$nodes/..//seriesStmt/idno[@type='volume'][1]}</publication_information>

and similarly for issue etc.

have to use .. here as $ad2 (despite its name) stores head eleemnts not
ad elements, so you first need to go up to the parent ad, then down to
delect volume.

other comments

let $ad2 := $ad//ad/head[contains(., 'muscle') or contains(., upper-case('muscle'))]
It's pointless calling a function on a string literal, the above could more
easily be written

let $ad2 := $ad//ad/head[contains(., 'muscle') or contains(., 'MUSCLE')]

it wouldn't find Muscle, don't you want

let $ad2 := $ad//ad/head[contains(upper-case(.), 'MUSCLE')]

which will find muscle in any case, or better to compare using
a case-blind collation if your system offers such a collation.


The Numerical Algorithms Group Ltd is a company registered in England
and Wales with company number 1249803. The registered office is:
Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom.

This e-mail has been scanned for all viruses by Star. The service is
powered by MessageLabs.

More information about the talk mailing list