RE: [xsl] param vs context for passing arguments

Subject: RE: [xsl] param vs context for passing arguments
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 16 Dec 2009 23:08:50 -0000
> This is simple template to replace hyphen with underscore in 'name' 
> attribute of some element;
> 
> <xsl:template name="ReplaceHyphenWithUnderscore">
>    <xsl:analyze-string select="@name" regex="-">
>      <xsl:matching-substring>
>        <xsl:text>_</xsl:text>
>      </xsl:matching-substring>
>      <xsl:non-matching-substring>
>        <xsl:value-of select="."/>
>      </xsl:non-matching-substring>
>    </xsl:analyze-string>
> </xsl:template>

Your code will be most versatile (reusable) if you write it as a function to
operate on any string.

> <xsl:function name="f:ReplaceHyphenWithUnderscore" as="xs:string">
      <xsl:param name="input" as="xs:string"/>
>    <xsl:analyze-string select="$input" regex="-">
>      <xsl:matching-substring>
>        <xsl:text>_</xsl:text>
>      </xsl:matching-substring>
>      <xsl:non-matching-substring>
>        <xsl:value-of select="."/>
>      </xsl:non-matching-substring>
>    </xsl:analyze-string>
> </xsl:template>
> 
Then you can write, for example
> 
> <xsl:template match="xsd:element[<some condition here>]">
>    <xsl:value-of name="f:ReplaceHyphenWithUnderscore(@name)"/>
>    (...)
> </xsl:template>
> 

Having said that, this particular operation can be achieved by a single call
of translate():

> <xsl:function name="f:ReplaceHyphenWithUnderscore" as="xs:string">
      <xsl:param name="input" as="xs:string"/>
      <xsl:sequence select="translate($in, '-', '_')"/>
> </xsl:template>

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay 

Current Thread