W3C home > Mailing lists > Public > xsl-editors@w3.org > April to June 2000

xsl:call-template Recommendation

From: Michael Holder <holderm@tusc.com>
Date: Sun, 25 Jun 2000 19:49:13 -0600
Message-ID: <004c01bfdf10$bd2d5a00$fafafea9@oemcomputer>
To: <xsl-editors@w3.org>
I think it would be useful if you could call a named template and give it an XPath expression.  In my example I have an element Address which contains children that I wish to use the SearchElement template on.  SearchElement is a named template that works only on the current node (.) and expects it to contain PCDATA.  Since I wish to search the Name, PostalAddress/Street, etc... children of Address I must use a default template (<xsl:template match="*">) so that I don't have to replicate my xsl:with-param everywhere (I sent another email about this, subject line "xsl:number Recommendation").  It would be useful if users could call a named template as <xsl:call-template name="SearchElement" select="PostalAddress/City"/>.  Here's my example:

    template for how to present Address
<xsl:template match="Address">
   <xsl:apply-templates select="Name"/>
   <xsl:for-each select="PostalAddress/Street">
      <xsl:apply-templates select="."/>
   <xsl:apply-templates select="PostalAddress/City"/>
   <xsl:text>, </xsl:text>
   <xsl:apply-templates select="PostalAddress/State"/>
   <xsl:text> </xsl:text>
   <xsl:apply-templates select="PostalAddress/PostalCode"/>

    template for how to present any element that we
    allow searches on... Number, Quantity, Description, Date
<xsl:template match="*">
   <xsl:call-template name="SearchElement">
      <xsl:with-param name="AnchorNumber">
         <xsl:number level="any" count="*" grouping-separator=" " grouping-size="10000"/>

    template for how to present any element that we
    allow searches on... Number, Quantity, Description, Date
<xsl:template name="SearchElement">
   <xsl:variable name="LowerDot">
      <xsl:value-of select="translate(.
                                    , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                                    , 'abcdefghijklmnopqrstuvwxyz')"/>

   <xsl:when test="contains($LowerDot
                          , $SearchText) ='true'
                   and $SearchText != ''
                   and $LowerDot != ''">
      <xsl:variable name="StartPosition">
         <xsl:value-of select="string-length(substring-before($LowerDot
                                                      , $SearchText)) + 1"/>

      <xsl:variable name="AfterLen">
         <xsl:value-of select="string-length(substring-after($LowerDot
                                                     , $SearchText))"/>

      <xsl:value-of select="substring(., 0, $StartPosition)"/>
      <A name="M{$AnchorNumber}">
      <B style="color:#000000;background-color:#ffff66">
      <xsl:value-of select="substring(., $StartPosition
                                    , string-length($SearchText))"/>
      <xsl:value-of select="substring(.
                                    , $StartPosition + string-length($SearchText)
                                    , $AfterLen)"/>
      <xsl:value-of select="."/>


Of course, I read that "Unlike xsl:apply-templates, xsl:call-template does not change the current node or the current node list." in http://www.w3.org/TR/1999/REC-xslt-19991116 so I'm not sure if you really want to allow this.  It is a bit like allowing <xsl:apply-templates name="SearchElement" select="PostalAddress/City"/>.  It certainly could be a subject for debate.  I guess if xsl:apply-templates causes you to move around the node tree then xsl:call-template must always apply to the current node or possibly children of the current node, is this not so?

I hope this idea is useful even if it is not in keeping with the philosophy of how xsl:call-template is used.

- Mike
Received on Sunday, 25 June 2000 21:46:49 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 20:44:18 UTC