[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