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

Re: Understanding difficulties with call-template

Subject: Re: Understanding difficulties with call-template
From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx>
Date: Thu, 26 Oct 2000 09:38:50 +0100
xsl call template passing nodes
Robert,

>OK got it working here this works.
>
><xsl:template name="comma-block">
>        <xsl:param name="nodes"/>
>        <xsl:for-each select="$nodes">
>                <xsl:value-of select="."/>
>                <xsl:if test="position() != last()">, </xsl:if>
>        </xsl:for-each>
></xsl:template>
>
><xsl:template match="preferred-locations">
><xsl:element name="p">
>Preferred Locations:
><xsl:call-template name="comma-block">
>        <xsl:with-param name="nodes" select="preferred-location"/>
></xsl:call-template>
></xsl:element>
></xsl:template>

Just an observation: when I find myself passing nodes or node lists into
named templates, I usually change them into moded templates because then I
don't have to fiddle around with passing and accepting parameters all the
time.  So the above can be changed to:

<xsl:template match="preferred-location" mode="comma-block">
  <xsl:value-of select="." />
  <xsl:if test="position() != last()">, </xsl:if>
</xsl:template>

<xsl:template match="preferred-locations">
  <p>
    Preferred Locations:
    <xsl:apply-templates select="preferred-location" mode="comma-block" />
  </p>
</xsl:template>

The current node list (which, as Mike Brown explained, you need to know
about to do tests on a node's position within it) is defined within the
xsl:apply-templates in the second template.  Templates are being applied to
all preferred-location children of preferred-locations, and the list of
those children becomes the node list within the first template.

There is another alternative, namely to test whether the preferred-location
has any following-sibling preferred-location (in other words, if it's the
last in the list).  This means you don't have to worry about what the
current node list is at all, because you are using information straight
from the DOM.  This has the advantage that you can use the same named
template for different elements that you want to list in a similar way:

<xsl:template name="comma-block">
  <xsl:for-each select="*">
    <xsl:value-of select="." />
    <xsl:if test="not(following-sibling::*)">, </xsl:if>
  </xsl:for-each>
</xsl:template>

<xsl:template match="preferred-locations">
  <p>
    Preferred Locations:
    <xsl:call-template name="comma-block" />
  </p>
</xsl:template>

<xsl:template match="disliked-locations">
  <p>
    Disliked Locations:
    <xsl:call-template name="comma-block" />
  </p>
</xsl:template>

I probably favour the first alternative because I don't like the difficulty
of checking what the current node is within the named template above: with
moded templates, it's easy to tell what the current node is.

Cheers,

Jeni

Jeni Tennison
http://www.jenitennison.com/


 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.