If you choose to process the text nodes, then the typeswitch will match them on the text() branch.
 
If you want to process the text nodes, and to number the elements in sequence as 1,2,3, then instead of using "at $number_out" to allocate the numbers, you could use count(preceding-sibling::*)+1. This is likely to be inefficient if the number of siblings becomes large. One way around this would be to have a memo-function node-number($e as element()) with the logic
 
let $x := $w/preceding-sibling::*
return if ($x) then node-number($x) else 1
 
This emulates the way xsl:number is implemented in XSLT.
 
Michael Kay


From: saxon-help-admin@lists.sourceforge.net [mailto:saxon-help-admin@lists.sourceforge.net] On Behalf Of Jochen Rebhan
Sent: 08 March 2006 13:48
To: saxon-help@lists.sourceforge.net
Subject: RE: [saxon] recursive function problem


Wow ! I didn't know about that difference ! Thanks.

But this leads me to the question whether there is a possibility within the typeswitch statement that allows me to recognize whether this is an empty text node or a normal element() ?

If yes, let me know !

Jochen

j.rebhan at web.de

 

saxon-help@lists.sourceforge.net schrieb am 08.03.06 12:54:12:

This is happening because you are counting whitespace text nodes as well as element nodes. Either replace child::node() by child::* (to select elements only), or use the command line option to cause whitespace to be stripped from source documents: -sa! ll.
 
For documents created within the query in a let expression, boundary whitespace is stripped by default.
 
Michael Kay


From: saxon-help-admin@lists.sourceforge.net [mailto:saxon-help-admin@lists.sourceforge.net] On Behalf Of Jochen Rebhan
Sent: 08 March 2006 11:33
To: saxon-hel! p@lists.sourceforge.net
Subject: [saxon] recursive function problem

Hi ,

I am having some problems reading an external file, the "no" attribute gets incremented by 2 instead of 1.

If I declare the external xml File as interal variable with "let", everyting works as expected, the "no" attribute gets incremented by 1.

Here the snippets:

(: the xquery file :)

xquery version "1.0";

declare variable $input external;

declare function local:copy($number_in as xs:integer, $node as element() , $level as xs:integer) as item()* {
 
    element { node-name($node ) }
    {
        if ($level eq 1) then attribute no { $number_in } else (),
       
        for $! c at $number_out in $node/child::node() return
           
     &n! bsp;      typeswitch($c)
                case $e as element() return local:copy( $number_out, $e, $level + 1)
                case $t as text()    return $t
                default              return <error/>
    }
};

local:copy(0,$input/*, 0)

 

(: the input file :)

<?xml version="1.0" encoding="UTF-8"?>
<root>
        <level1>something</level1>
   &nb! sp;    <level1 attr="someatt">some text</level 1>
        <level1>some text v! alue</level1>
        < level1 attr="ter">some text</level1>
        <level1 someattr="something">
                <someelem>simple text</someelem>
                <someelems>simple textm</someelems>
        </level1>
        <level1 someattr="more text">
                <someelem>test1</someelem>
                <someelems>test2</someelems>
   !      </level1>
        <level1 someattr="some other text">
  &! nbsp;             <someelem>simple text1</someelem>
                <someelems>simple text2</someelems>
        </level1>
        <level1 someattr="sometext">
                <someelem attr="someatt">some text</someelem>
                <someelems attr="someatt">some text</someelems>
        </level1>
</root>

 

(: the windows .bat file I use! :)

java  -cp saxon8.jar net.sf.saxon.Query -o test.out.xml test.xq +input=test.in.xml

 

(: the output looks like th! at, note the "no" attribute gets incremented by 2 instead of 1 :)

< P><?xml version="1.0" encoding="UTF-8"?>
<root>
        <level1 no="2">something</level1>
        <level1 no="4">some text</level1>
        <level1 no="6">some text value</level1>
....

Any idea why 2 ? As I said, when I define the Xml Input document as variable inside the Xquery file everything works like expected !

Any help is appreciated, thanks.

j.rebhan at web.de



Erweitern Sie FreeMail zu einem noch lei! stungsstarkeren E-Mail-Postfach!    
Mehr Infos unter http://freemai! l.web.de/home/landingpad/?mc=021131  



Verschicken Sie romantische, coole und witzige Bilder per SMS!   
Jetzt bei WEB.DE FreeMail: http://f.web.de/?mc=021193