[xquery-talk] XQuery and id()/idref(); Controlling the children of nodes in the result sequence

Maik Stührenberg maik.stuehrenberg at uni-bielefeld.de
Wed Apr 23 14:21:10 PDT 2008


Hi Florent and Michael,

thanks for your response.

Florent Georges schrieb:
> Maik Stührenberg wrote:µ
> 
  >   You have to add the namespace nodes to the resultset
> element.  If the above example is a simplification, your
> real problem may require more complexity to select the
> namespace nodes to add, but from your example, you can
> choose to add the namespace nodes from each result/*.
> 
>   To see how to add a namespace node to an element, you can
> have a look at:
> 
> http://fgeorges.blogspot.com/2006/08/add-namespace-node-to-element-in.html
> 
>   You'll be interested too by the functions
> in-scope-prefixes() and namespace-uri-for-prefix().

Again, thanks to both of you. That problem was easy to solve.
> 
>   But first, I wonder if it is really worth writing that...
> 
>> - The biggest issue is that the b:para element is output
>> twice: as child element of the b:text element (which is
>> quite fine) and alone. The same problem appears when
>> looking at the c:word elements: they should not be
>> included as children of the c:sentence element because
>> they are related to different spans, but only as children
>> of the respective result element.
> 
>   I am not sure of the question.  If you want to "have an
> element without its children", you have to understand the
> XPath data model: child elements are part of their parent.

Well the problem is: the query should select all element nodes 
(including their children), if they share the same value of their a:span 
attribute (such as b:para and b:text -- vs. c:sentence and c:word where 
c:word is child of c:sentence but does refer to another a:span).

> If you want a parent that "looks the same" but without the
> children, you have to create a new element.  For instance,
> instead of:
> 
>     $d/a:collection/a:entry/a:data//*[@a:span = $s/@xml:id]
> 
> use rather:
> 
>     for $e in $d/a:collection/a:entry/a:data
>                 //*[@a:span = $s/@xml:id]
>       return
>         element { node-name($e) }{ $e/@* }

@Florent: Thanks for the hint, but in that case, the hierarchical 
relationship between b:text and b:para would get lost. Instead of getting

<b:text a:span="seg1">
  <b:para a:span="seg1"/>
</b:text>

the result is

<b:text a:span="seg1"/>
<b:para a:span="seg1"/>

@Michael: I'm aware that my path expression selects element nodes and 
their descendants, but there are cases in which this is necessary (if 
the descendants refer to the same a:span) -- and some in which not (if 
the descendants refer to different a:span elements than their ancestor).

So the question is, is it possible to recursively traverse the 
descendants of the a:data node and select only those element nodes which 
   refer to the same a:span element?

Regarding your answers to the idref() function: I will double check next 
time that the document is validated and that I use the -val:strict 
option in Saxon-SA.

Kind regards,

Maik Stührenberg




More information about the talk mailing list