W3C home > Mailing lists > Public > www-ql@w3.org > October to December 2002

Re: Things that one can define with XML schema but cannot query with XQuery?

From: Jonathan Robie <jonathan.robie@datadirect-technologies.com>
Date: Thu, 31 Oct 2002 13:35:10 -0500
Message-Id: <>
To: "Marko Smiljanic" <markosm@cs.utwente.nl>, <www-ql@w3.org>

At 11:17 AM 10/30/2002 +0100, Marko Smiljanic wrote:

>We can assume that the XML schema designer had a specific semantics in mind
>when he specified that a sequence <A/><B/> should repeat it self. E.g. <A/>
>can be the name of a man and <B/> can be his address. We thus have from 1 to
>5 pairs of person name / person address (where address does not have to be
>Note that each single person is represented by one sequence. I can say that
>sequence has a clear semantics i.e. 1 sequence = 1 person. (and each person
>has a name and an address)

On the other hand, we can also assume that this is not an experienced 
schema designer. If your data reflects a concept as important as a person, 
that person should be reflected in the markup. So I think that your schema 
designer should have used a structure that looks more like:

                 <name>Marko Smiljanic</name>
                       <address>P.O. Box 217, 7500 AE Enschede, The 

Still, it can be queried, but the queries will be less natural than for a 
well-designed schema.

>My questions are:
>a) How can we specify a query in XQuery language saying that I'm interested
>in 2nd persons address (i.e. <B>). (The answer should be empty for the
>example above).

In your schema, this is the same as asking for the first element that 
follows the second A, if that element happens to be a B.

let $r := input()/root,
      $a2 := ($r/A)[2],  {-- the second A --}
      $next := ($r/*[ . >> $a2])[1]   {-- the first element after the 
second A --}
      if (local-name($next) eq 'B')
         then $next
         else ()

>b) This is similar to the problem in a): is there any way that that I can
>count the number of A,B sequences in an instance XML document (using
>XQuery). (The example above has 3 sequences).

That's easy - for the schema you provided, this is the same as the number 
of A elements. Each sequence has precisely one A element:

         count( input()/root/A )

Hope this helps!

Received on Thursday, 31 October 2002 13:35:44 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 20:17:15 UTC