- From: Michael Holder <holderm@tusc.com>
- Date: Sun, 25 Jun 2000 19:49:13 -0600
- To: <xsl-editors@w3.org>
- Message-ID: <004c01bfdf10$bd2d5a00$fafafea9@oemcomputer>
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 Sunday, 25 June 2000 21:46:49 UTC