[xquery-talk] Where Clause and XDT:Untyped Issues

Wei, Alice J. ajwei at indiana.edu
Sat Feb 2 17:12:06 PST 2008

Hi, Michael:

  Thanks, I did not realize that my <head type="main"> and <head type="sub"> can bring so many of these relevant errors.

   I have fixed up the code to as follows:

let $ad := fn:collection("xmldb:exist://db/my")//ad
let $sorted_result:=
for $doc in distinct-values($ad)
where contains($ad/head[@type='sub'],'Baseball')
order by $doc
return $doc
for $r at $count in $sorted_result
let $nodes := $ad[. = $r]
Showing Result: {$count} / {count($sorted_result)}

This produces no type error issues, but neither does it bring back results.

If I  change the where clause to where contains($doc,'Baseball'),
it brings back something like the one in the following:

<statistics> Showing Result: 1 / 1</statistics>
<emph rend ="bold deepink">Hostess</emph>
is back with new Baseball Cards...to collect and trade with your friends.</head>
<emph rend ="bold orange">3 Free Baseball Cards</emph>
<emph rend ="bold">on specially marked boxes of Hostess® Snack Cakes.</emph>
<p>A total of 150 cards. Full of facts. Collect 'em. Trade 'em.</p>
<p>3 full-color cards printed on the bottom of every specially marked box of Twinkies
<emph rend ="sup">®</emph>
, Cup Cakes, Suzy Q's
<emph rend ="sup">®</emph>
, and other mmmmmmmm-delicious Hostess
<emph rend ="sup">®</emph>
Snacks. </p>
<note>®Hostess. Twinkies and Suzy Q's are registered trademarks of ITT Continental Baking Co.
Offer expires August 31, 1976</note>
<!--Another duplicate of the <ad>  -->

Is it possible that I cannot utilize the where clause at all here? Or, do I have to call up using another user-defined function?

Thanks for your help.
Alice Wei
MIS 2008
School of Library and Information Science
Indiana University Bloomington
ajwei at indiana.edu
From: Michael Kay [mike at saxonica.com]
Sent: Saturday, February 02, 2008 10:33 AM
To: 'Torsten Grust'
Cc: talk at x-query.com; Wei, Alice J.
Subject: RE: [xquery-talk] Where Clause and XDT:Untyped Issues

What's more, I would expect

let $ad := fn:collection("xmldb:exist://db/my")//ad

to return a set containing several ad elements. The only way


can return true is if exactly one of those ad elements has a child called
head - which seems intrinsically rather unlikely. If there's more than one
head element, it fails with a type error; if there are none, it return

Incidentally, it's a common mistake to imagine that contains() is a test for
set membership, rather than a test for the presence of a substring. I
suspect that might be happening here. But who knows.

Michael Kay

More information about the talk mailing list