- From: James Clark <jjc@jclark.com>
- Date: Mon, 26 Jun 2000 13:49:34 +0700
- To: Michael Holder <holderm@tusc.com>
- CC: xsl-editors@w3.org
Just wrap the xsl:call-template in a xsl:for-each. One reason for not allowing an optional select attribute on xsl:call-template is that it would lead to xsl:apply-templates and xsl:call-template having inconsistent defaults for the select attribute. > Michael Holder wrote: > > 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"> > <p> > <xsl:apply-templates select="Name"/> > </p> > <xsl:for-each select="PostalAddress/Street"> > <p> > <xsl:apply-templates select="."/> > </p> > </xsl:for-each> > <p> > <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"/> > </p> > </xsl:template> > > <!-- > 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"/> > </xsl:with-param> > </xsl:call-template> > </xsl:template> > > > > <!-- > 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:variable> > > <xsl:choose> > <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> > > <xsl:variable name="AfterLen"> > <xsl:value-of select="string-length(substring-after($LowerDot > , > $SearchText))"/> > </xsl:variable> > > <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))"/> > </B> > </A> > <xsl:value-of select="substring(. > , $StartPosition + > string-length($SearchText) > , $AfterLen)"/> > </xsl:when> > <xsl:otherwise> > <xsl:value-of select="."/> > </xsl:otherwise> > </xsl:choose> > > </xsl:template> > 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 Monday, 26 June 2000 02:53:50 UTC