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

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
>specified).
>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:

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

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 --}
return
      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!

Jonathan

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