[xquery-talk] Construct the absolute xpath (with node position)

Vallone, Philip Mr CTR USA AMC Philip.Vallone at us.army.mil
Tue Jun 17 14:25:53 PDT 2008


Michael, thank you for your help.

I am using saxon 9.006 .NET API. I am receiving the following error: 

XQuery static error in #....), '/') return <out>{$xpath}#:
    Variable $xpath has not been declared

Here is my xquery:

declare function f:name-and-position($n as element()) as xs:string {
  concat(name($n), '[', 1+count($n/preceding-sibling::*[node-name(.) =
node-name($n)), ']')
}
for $path in //item/para
let $xpath :=
$path/string-join(ancestor-or-self::*/f:name-and-position(.), '/') 
return <out>{$xpath}</out>

I have never used user defined functions in xquery so I am probably
doing something wrong.

Thanks for the help.

Phil







-----Original Message-----
From: talk-bounces at x-query.com [mailto:talk-bounces at x-query.com] On
Behalf Of Michael Kay
Sent: Tuesday, June 17, 2008 12:41 PM
To: Vallone, Philip Mr CTR USA AMC; talk at x-query.com
Subject: RE: [xquery-talk] Construct the absolute xpath (with node
position)


Sure, just replace name() in your example by f:name-and-position(.),
which function is defined as

declare function f:name-and-position($n as element()) as xs:string {
  concat(name($n), '[',
1+count($n/preceding-sibling::*[node-name(.)=node-name($n)), ']')
}

This is assuming that your XQuery processor supports the
preceding-sibling axis. Officially it's optional, as is the ancestor
axis.

Michael Kay
http://www.saxonica.com/
 

> -----Original Message-----
> From: talk-bounces at x-query.com
> [mailto:talk-bounces at x-query.com] On Behalf Of Vallone, Philip Mr CTR 
> USA AMC
> Sent: 17 June 2008 16:56
> To: talk at x-query.com
> Subject: [xquery-talk] Construct the absolute xpath (with node 
> position)
> 
> 
> Hi, is it possible to construct the absolute xpath (with node
> position) from an xquery expression?
> 
> Take the following XML:
> 
> <root>
> 	<item>
> 		<para>hello</para>
> 		<para>goodbye</para>
> 	</item>
> 	<item>
> 		<para>hello</para>
> 		<para>goodbye</para>
> 		<para>end</para>
> 	</item>
> 	<item>
> 		<para>hello</para>
> 		<para>middle</para>
> 		<para>goodbye</para>
> 	</item>
> </root>
> 
> Take the following xquery:
> 
> for $path in //item/para
> let $xpath := $path/string-join(ancestor-or-self::*/name(),
> '/') return <out>{$xpath}</out>
> 
> Which returns:
> 
> <out>root/item/para</out>
> <out>root/item/para</out>
> ....
> 
> 
> Is it possible to construct an xquery expression to output the xpath 
> with node position:
> 
> <out>/root/item[1]/para[1]</out>
> <out>/root/item[1]/para[2]</out>
> <out>/root/item[2]/para[1]</out>
> <out>/root/item[2]/para[2]</out>
> <out>/root/item[2]/para[3]</out>
> <out>/root/item[3]/para[1]</out>
> <out>/root/item[3]/para[2]</out>
> <out>/root/item[3]/para[3]</out>
> 
> Thanks for the help.
> 
> Phil	
> 
> _______________________________________________
> talk at x-query.com
> http://x-query.com/mailman/listinfo/talk

_______________________________________________
talk at x-query.com
http://x-query.com/mailman/listinfo/talk



More information about the talk mailing list