This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: accessing last element of node set passed as parameter


Thanks David!  Some of this is starting to click ... but then again something happens that shuts the clicker down.

Since order is important to me, I decided to heed your warning about the ordering of a union being implementation dependent, so I set about making all of the "BAR" elements be siblings of one another.  I replaced:

    <xsl:apply-templates select="following-sibling::*[1]">
        <xsl:with-param name="result" select="$result|xalan:nodeset($new)"/>
    </xsl:apply-templates> </xsl:template> 

with:

    <xsl:apply-templates select="following-sibling::*[1]">
        <xsl:with-param name="result">
            <xsl:copy-of select="$result"/>
            <BAR i="{$i}"/>
        </xsl:with-param>
    </xsl:apply-templates> </xsl:template> 

but now I get the following error message:

    Can not convert #RTREEFRAG to a NodeList!

at the line:

    <xsl:copy-of select="($result/BAR)[last()]" />

the first time the "A" template is matched with a non-empty value for "result".  Shouldn't "result" be a node set?

Paul (I think this language is going to make my head explode)
 
--

On Tue, 21 May 2002 18:09:50  
 David Carlisle wrote:
>
>
>     produce identical output given the input:
>      <IN><A/><A/><A/><A/><A/><A/></IN>
>
>   Below is a transform in which the two lines:
>
>    <xsl:copy-of select="($result/BAR)[last()]" />
>    <xsl:copy-of select="$result[last()]" />
>
>
> "$result|xalan:nodeset($new)"/>
>
>Ha! I guessed two possible meanings:
>
>
>
>> But they can not have done. If $result holds a root node then
>> $result/BAR
>> selects all the BAR children of that node and
>> ($result/BAR)[last()]
>> selects the last of those children.
>> 
>> But if $result contains three BAR nodes then
>> 
>> $result/BAR
>> 
>> selects all the BAR children of each element of $result, and that is
>> empty so ($result/BAR)[last()] is similarly empty.
>> 
>>  
>
>But in fact you have a third.
>
>$result in this case contains three _root_ nodes so $result does have
>three nodes, so <xsl:copy-of select="($result/BAR)[last()]" does pick
>out the last. But they are root nodes not BAR nodes so
>"($result/BAR)[last()]" gives you the last BAR.
>Since copy-of throws away root nodes and just gives you thier contents,
>you do get the same.
>
>Note however that it is undefined which one you get, you are taking the
>union of a new root node with a set of existing root nodes. Root nodes
>are in an implementation defined order so you can not be sure that the
>last one you added is the one you get with last().
>
>If the order matters you need to make sure your bar elements are
>siblings of each other, then the result variable will have a single root
>node containing the elements that you are interested in.
>
>David
>
>_____________________________________________________________________
>This message has been checked for all known viruses by Star Internet
>delivered through the MessageLabs Virus Scanning Service. For further
>information visit http://www.star.net.uk/stats.asp or alternatively call
>Star Internet for details on the Virus Scanning Service.
>
> XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>
>


________________________________________________________
Outgrown your current e-mail service?
Get a 25MB Inbox, POP3 Access, No Ads and No Taglines with LYCOS MAIL PLUS.
http://login.mail.lycos.com/brandPage.shtml?pageId=plus

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]