[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