[xquery-talk] index-of() behavior

Michael Kay mike at saxonica.com
Thu Mar 19 15:46:26 PST 2009


index-of() compares items by atomizing them and comparing the atomic values
using the eq operator.

What you're trying to do could be achieved simply by

for $child at $index in $content/y return
  <result>{$index}</result>

but if you want a general function that's like index-of except that it
compares using node identity, you could do

declare function my:index-by-identity($seq as node()*, $srch as node()) {
  for $i at $p in $seq where $i is $srch return $p
}

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 Joe Wicentowski
> Sent: 19 March 2009 15:28
> To: talk at x-query.com
> Subject: [xquery-talk] index-of() behavior
> 
> Hi all,
> 
> Can anyone shed some light on the following question?  I'm 
> trying to use fn:index-of() to derive the sequential 
> appearance of elements -- in this case, I have 2 <y> 
> elements, and I want index-of() to return the values 1 and 2:
> 
> <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>
> 
> but instead it returns:
> 
> <results>
>    <result>1 2</result>
>    <result>1 2</result>
> </results>
> 
> If, on the other hand, I change $content to
> 
>     <x>
>         <y n="1">z1</y>
>         <y n="2">z2</y>
>     </x>
> 
> Then I get my desired result.  Shouldn't fn:index-of() index 
> against the unique <y> nodes rather than their text content?  
> I've tested this in eXist 1.3 and in oXygen (using Saxon 9).
> 
> Thanks,
> Joe
> _______________________________________________
> talk at x-query.com
> http://x-query.com/mailman/listinfo/talk



More information about the talk mailing list