[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Finding another element with the same name as thec

Subject: Re: Finding another element with the same name as thecurrent node
From: Jo Bourne <venus@xxxxxxxxx>
Date: Fri, 02 Feb 2001 10:10:39 +1100
another name for current
Thankyou so much! This explanation is just wonderful! One thing I am
wondering, with the key option:

<xsl:apply-templates select="key('branch1-elements', name())" />

Is why I don't need name() = name(current() like I do for the other options?

Cheers
Jo

On 2/2/01 12:51 AM, "Jeni Tennison" <mail@xxxxxxxxxxxxxxxx> wrote:

> Hi Jo,
> 
>> My xml document has two main "branches" and while processing
>> elements in one branch I need to find an element in the other branch
>> with the same name and extract the value of one of its attributes.
>> Is there a way of finding the name of the element currently being
>> processed in a for-each loop and inserting it as a variable within
>> the loop?
> 
> You're almost there.  This is the bit that you're having difficulty
> with:
> 
> <xsl:apply-templates select="//branch1/NAME_OF_CURRENT_ELEMENT">
> 
> You can get the name of the current element using:
> 
> name(current())
> 
> You can test whether the name of some context element is equal to that
> name with:
> 
> name() = name(current())
> 
> So if you select all the element children of branch1 and then filter
> those with a predicate so that only those with the same name as the
> current element are selected, then you'll get what you want:
> 
> <xsl:apply-templates select="//branch1/*[name() = name(current())]">
> 
> Rather than using name(current()) you may find it clearer to store the
> name of the current node in a variable, and then use that:
> 
> <xsl:variable name="el-name" select="name()" />
> <xsl:apply-templates select="//branch1/*[name() = $el-name]" />
> 
> [Aside: I've used name() in the above because it looks as though
> that's all you need in your example, but if you have namespaces
> floating around the place, then you might want to use local-name(),
> perhaps combined with namespace-uri() or a namespace-specific node
> test instead.]
> 
> If you're doing this a lot, you may find it more more efficient to use
> a key to allow you quick access into the branch1 elements by name.
> The key would look like:
> 
> <xsl:key name="branch1-elements"
>        match="branch1/*"
>        use="name()" />
> 
> You could then quickly get at the relevant branch1 element by name
> with:
> 
> <xsl:apply-templates select="key('branch1-elements', name())" />
> 
> If you don't use a key, it's probably a bit more efficient to store
> the branch1 elements in a variable that you create outside the
> xsl:for-each, and then index into that list.  This is because building
> up a list each time will probably be more work for the processor:
> 
> <xsl:variable name="branch1-elements" select="//branch1/*" />
> <xsl:for-each select="*">
>    ...
>    <xsl:apply-templates
>      select="$branch1-elements[name() = name(current())]" />
>    ...
> </xsl:for-each>
> 
> I hope that helps,
> 
> Jeni
> 
> ---
> Jeni Tennison
> http://www.jenitennison.com/
> 
> 

-- 
Jo Bourne
Virtual Artists Pty Ltd


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


Current Thread

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-2013 All Rights Reserved.