[xquery-talk] index-of() behavior
Florent Georges
lists at fgeorges.org
Thu Mar 19 15:55:14 PST 2009
Joe Wicentowski wrote:
> <results>{
> let $content :=
> <x>
> <y n="1">z</y>
> <y n="2">z</y>
> </x>
> for $child in $content/y
> let $index := fn:index-of($content/y, $child)
> return
> <result>{$index}</result>
> }</results>
> I expected this to return:
> <results>
> <result>1</result>
> <result>2</result>
> </results>
index-of() compares items by value. If you want to use identity comparison instead, you can write your own function to do that. A simple recursive function is obvious:
declare function local:index-of($seq as node()*, $n as node())
as xs:integer*
{
local:index-of($seq, $n, 1)
};
declare function local:index-of($seq as node()*, $n as node(), $i as xs:integer)
as xs:integer*
{
if ( empty($seq) ) then
()
else if ( $seq[1] is $n ) then
( $i, local:index-of(remove($seq, 1), $n, $i + 1) )
else
local:index-of(remove($seq, 1), $n, $i + 1)
};
<results> {
let $content := <x>
<y n="1">z</y>
<y n="2">z</y>
</x>
for $child in $content/y
return
<result>{ local:index-of($content/y, $child) }</result>
}
</results>
results in:
<results>
<result>1</result>
<result>2</result>
</results>
Hope that helps,
--
Florent Georges
http://www.fgeorges.org/
More information about the talk
mailing list