[XQuery Talk Mailing List Archive Home] [By Date] [By Thread] [By Subject] [By Author] [Recent Entries] [Reply To This Message]

index-of() behavior

Joe Wicentowski joewiz at gmail.com
Thu Mar 19 15:05:08 PST 2009


  index-of() behavior
An update: I actually used's Florent's function for one of my two
cases.  What I'm actually doing is processing footnotes (specifically,
TEI <note> elements) so they appear inline and at the end of the
document.  I'm using recursive typeswitching to mimic XSLT.  The "at"
clause worked for the 2nd case -- where I'm iterating through the
<notes> all at once, but it didn't work when in the 1st case, where
the function was only receiving one <note> at a time.  For that case,
I needed to step out of the received node and call Florent's
functions.

Thanks very much, Florent!

p.s. In case anyone's interested, here is the "at" clause at work:

declare function render:note-end($content, $options) as element() {
        <div class="footnotes">
            {
            for $note at $incr in $content//tei:note
            return
                if ($note/@type = 'summary') then
                    (: suppress ePub summary notes from being displayed :)
                    ()
                else
                    <p>
                        <a href="{concat('#fnref', $incr)}"
name="{concat('fn', $incr)}" title="Return to text">
                            <sup>
                                {data($note/@n)}
                            </sup>
                        </a>&#160;{render:recurse($note, $options)}
                    </p>
            }
        </div>
};

and here is where I call Florent's functions:

declare function render:note($node as element(tei:note), $options ) as
element() {
        let $incr :=
xs:integer(local:index-of($node/ancestor::tei:div[1]//tei:note,
$node))
        return
        <a href="{concat('#fn', $incr)}" name="{concat('fnref', $incr)}">
            <sup>
                {data($node/@n)}
            </sup>
            <span class="footnoteinline">
                {data($node/@n)}.&#160;{data($node)}
            </span>
        </a>
};


On Thu, Mar 19, 2009 at 11:55 AM, Florent Georges <http://x-query.com/mailman/listinfo/talk> wrote:
>
> 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/
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2007 All Rights Reserved.