XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Florian SchöllhammerSubject: XQuery: How to set Ordering Mode
Author: Florian Schöllhammer
Date: 17 Aug 2004 06:53 AM
Hello - i just wanted to ask, how to set the default ordering mode of
- union, intersect, except
- xpath expressions

at www.w3c.org i read:
http://www.w3.org/TR/xquery/#id-default-ordering-decl

i just wanted to ask, wheter Stylus Studio supports ordering mode or not


----- query1.xquery -------

declare ordering ordered;

<hello xmlns="http://localhost/complex">
{
let $a := <a />
let $b := <b />
let $c := <c />
return
<set>{($b, $a) union ($b, $a, $c)}</set>
}
</hello>

-----------------------------

this file produces an error (built-in processor) in the declare ordering line:
"parse error, unexpected _SEMICOLOR_, expecting $"
- i think, this is because it wants to declare a variable!

without this line, it works, but the result is ordered alphabetically:

--- RESULT ----

<hello xmlns="http://localhost/complex">
<set>
<a/>
<b/>
<c/>
</set>
</hello>

--------------


Is there any way to enable the ordering mode (so the result is ordered with the document order)?

And another short question - what do i have to do to indent the output?

thanks,
florian schöllhammer

Postnext
Alberto MassariSubject: Re: XQuery: How to set Ordering Mode
Author: Alberto Massari
Date: 17 Aug 2004 03:32 PM
Hi Florian,
the syntax you are trying to use is from the latest version of the spec,
dated July 23rd 2004. The version of Stylus you are using has been released
before that date, and implements the specs as of November 2003.

In any case, the default ordering mode is "ordered", so that declaration is
not changing the behavior of the query; what is the result you are expecting?

The correct result, in my opinion, is what you are getting now; $a, $b and
$c are bound to newly created (and disconnected) DOM nodes, so there is no
document order between them.

As for the indentation, you can try adding "declare xmlspace = preserve" in
the header; that will preserve the whitespace found inside the DOM nodes,
but you will need some experimenting.

Hope this helps,
Alberto


Postnext
Florian SchöllhammerSubject: Re: XQuery: How to set Ordering Mode
Author: Florian Schöllhammer
Date: 17 Aug 2004 05:16 PM
thanks alberto, it is a bit more clear now!

i want to give you two examples to show you which kind of result i want

---

assume following variables:

$a = <a/>
$b = <b/>
$c = <c/>

<res>{($b, $a)}</res>

produces

<res>
<b/>
<a/>
</res>


hmm, thats why i assumed following:

<res>{($b, $a) union ($b, $a, $c)}</res>
would be transformed to:
<res>{($b, $a, $c)}</res>
(because the duplicated entries are deleted by union)

that would result in

<res>
<b/>
<a/>
<c/>
</res>

instead i got:

<res>
<a/>
<b/>
<c/>
</res>

i found out, that the elements, that were defined earlier ($a), occur earlier in document-order (so it is not true, that they are sorted alphabetically, your statement was absolutely right - thanks)

-----

another example:

<result>
{
let $data :=
<x>
<y/>
<z/>
</x>
return
$data/(z, y)
}
</result>

should result in

<result>
<z>
<y>
</result>

according to w3c recommendation:
http://www.w3.org/TR/xquery/#construct_seq
(see example 3 - it says, that first all the sequence-element1-childre should be returned, then, all sequence-element2-children ...

but the result with stylus studio is:

<result>
<x>
<y>
</result>

??? i tried a long time and i found out, that the result is always in document order


okay, i think i understand what it means "to get the result in document order" - and i know, that i don't want it in document order (to get the results i expected) - is there a way to get there?

-----

declare xmlspacepreserve;
hmm, it does not really do, what i want it to do ... (it produces only a few linebreaks, code remains unformatted)

i found something in the xquery-specification (i know, i always talk about specifications, but i do not know another reliable source, where i could get the information from)
http://www.w3.org/TR/xquery/#id-xq-serialization-parameters

it seems as if there is an parameter called "indent" - but how can i set this parameter, it says:
"For each parameter, an XQuery implementation may (but is not required to) provide a means whereby a user can override the default value."

is it possible to set this parameter in stylus studio?


thanks, florian

Postnext
Florian SchöllhammerSubject: Re: XQuery: How to set Ordering Mode
Author: Florian Schöllhammer
Date: 17 Aug 2004 05:30 PM
hello again,

i just didn't realize, that i was using the wrong specification!

so the first problem (Union) is solved, because the result is always returned in document order (according the spec. of november 2003)

but, i still do not understand the second example - why is the result in document order (according to the spec, it shouldn't - or do i misunderstand it???)

Postnext
Alberto MassariSubject: Re: XQuery: How to set Ordering Mode
Author: Alberto Massari
Date: 18 Aug 2004 05:41 PM
Hi Florian,

>but, i still do not understand the second example - why is the result in
>document order (according to the spec, it shouldn't - or do i
>misunderstand it???)

You would get the order you expect if you just typed (z, y); but you have
$data/(z, y) and this is a path expression.
Reading from §3.2:
"
Each operation E1/E2 is evaluated as follows: Expression E1 is evaluated,
and if the result is not a (possibly empty) sequence of nodes, a type error

is raised.[err:XP0019] Each node resulting from the evaluation of E1 then
serves in turn to provide an inner focus for an evaluation of E2, as
described in 2.1.2 Dynamic Context. Each evaluation of E2 must result in a

(possibly empty) sequence of nodes; otherwise, a type error is
raised.[err:XP0019] The sequences of nodes resulting from all the
evaluations of E2 are combined, and duplicate nodes are eliminated based on

node identity. If ordering mode is ordered, the resulting node sequence is

returned in document order; otherwise it is returned in
implementation-dependent order
"
So the final result must be in document order.
The good news for you is that you can get the result you expect by wrapping

the query in a unordered() call, like in unordered($data/(z, y))

P.S. keep in mind that the unordered() function has been promoted to be a
keyword in the latest specs, so you will need to change the query in the
future.

As for the question on the indentation of the result, those properties
should be (if I recall it correctly) in the XSLT & XQuery Serialization
specs, that we have not (yet) implemented. In a future version you will be

able to specify those properties to control how the output is generated.

Alberto


Posttop
Florian SchöllhammerSubject: Re: XQuery: How to set Ordering Mode
Author: Florian Schöllhammer
Date: 18 Aug 2004 05:50 PM
Thanks a lot for this detailed explanation, Alberto! I think i do understand it now! thanks!

 
Topic Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.