I am having trouble using the “contains” function to locate a document based on partial content of one of its elements when the element may occur more than once. This happens frequently in a medical data base where symptoms, medications, and other factors have this requirement.
To illustrate, I have changed your example file, “xmp-data.xml” slightly, removing the and subelements under , leaving just the tag and the surname, as follows:
TCP/IP Illustrated
Stevens
Addison-Wesley
65.95
Advanced Programming in the Unix environment
Stevens
Addison-Wesley
45.00
Data on the Web
Abiteboul
Buneman
Suciu
Morgan Kaufmann Publishers
39.95
The following query:
{
for $b in document(“data/xmp-data.xml”)/bib/book
where contains ($b/author/text(), “Bune”)
return
{
$b/title
}
}
produces the following error message:
<?xml version="1.0"?>
<quip:ExecutionError xmlns:quip=“http://namespaces.softwareag.com/tamino/quip/”>
quip:queryFileC:\DOCUME~1\wstellho\LOCALS~1\Temp\Query23873.tmp
</quip:queryFile>
quip:message
<![CDATA[Error (3,9): wrong type of arguments for function 'contains'[Abiteboul,Buneman,Suciu][Bune]
]]>
</quip:message>
</quip:ExecutionError>
I can around get this error by specifying the position of the author’s name, but that isn’t very practical in general:
{
for $b in document(“data/xmp-data.xml”)/bib/book
where contains ($b/author[2]/text(), “Bune”)
return
{
$b/title
}
}
<?xml version="1.0"?>
<quip:result xmlns:quip=“http://namespaces.softwareag.com/tamino/quip/”>
Data on the Web
</quip:result>
Even this approach wouldn’t work if I hadn’t removed the and subelements and had searched for, say,
?contains($b/author/last[2]/text(), “Bune”)
Thanks.
the contains function expects two string
arguments. In your first query, however as first
argument a sequence of two text nodes is passed.
Your second version selects on of the text-nodes
explicitly and thus satifsfies the argument type
of the contains function.
Another way to handle this situation would be
by using the ‘string-value’ function:
{
for $b in document(“data/xmp-data.xml”)/bib/book
where contains (string-value($b/author), “Bune”)
return
{
$b/title
}
}
This will do what you want, even with last and
first tags in your data.
Sven Eric
Thanks. That works fine.