[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