[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

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