Author:
Zimmen
Version:
1.03
Release Date:
1 Dec 2011
Category:
String Operations

Description

String utility functions (yes, functions)

version:  1.03
author:   Simon de Turck
email:    simon@zimmen.com

Maintained on gist

To use these functions add the string namespace to your master (or wherever you feel it suits best) stylesheet and import this utility. Add the namespace xmlns:string="http://www.getsymphony.com/functions" to all stylesheets where you want to use these functions.

This utility uses some EXSLT that is supported in libxslt 1.0.19 and later

Usage:

Convert string to lowercase:

<xsl:value-of select="string:lower-case([selector])" />
example:
<xsl:value-of select="string:lower-case('ABC')" />

abc

Convert string to uppercase:

<xsl:value-of select="string:upper-case([selector])" />
example:
<xsl:value-of select="string:upper-case('abc')" />

ABC

Capitalize string (by vladG?):

<xsl:value-of select="capitalize([selector])" />
<xsl:value-of select="ucfirst([selector])" /> (alias)
example:
<xsl:value-of select="capitalize('the t in this sentence is capitalized!')" />

The t in this sentence is capitalized!

Capitalize each word in a string:

<xsl:value-of select="capitalize-words([selector])" />
<xsl:value-of select="ucall([selector])" /> (alias)
example:
<xsl:value-of select="capitalize-words('all words in this sentence are capitalized!')" />

All Words In This Sentence Are Capitalized !

Replace in string:

<xsl:value-of select="string:replace([selector],[needle],[replace])" />
example:
<xsl:value-of select="string:replace('a b c',' ',' to the ')" />

a to the b to the c

Split a string (returns a nodeset):

<xsl:copy-of select="string:split([selector][,[delimiter],[rootnodename],[nodename]])" />
  • Default delimiter: ','
  • Default rootnodename: 'nodeset'
  • Default nodename: 'node'
example 1:
<xsl:copy-of select="string:split('a,b,c')" />

<nodeset>
    <node>a</node>
    <node>b</node>
    <node>c</node>
</nodeset>
example 2:
<xsl:copy-of select="string:split('book1#book2#book3','#','bookstore','book')" />

<bookstore>
    <book>book1</book>
    <book>book2</book>
    <book>book3</book>
</bookstore>
example 3:
<xsl:copy-of select="string:split('item1#item2#item3','#','ul','li')" />

<ul>
    <li>book1</li>
    <li>book2</li>
    <li>book3</li>
</ul>

Count occurrences of a string in a string (by phoque):

To count elements (lets say <a href>'s in your text fields) you should use count(text/*/a) instead.

<xsl:value-of select="string:substring-count([needle],[haystack])" />
example
<xsl:value-of select="string:substring-count('the quick brown fox jumps over the lazy dog','the')" />

2

XSLT

View Raw
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:string="http://www.getsymphony.com/functions"
                xmlns:_string="http://www.getsymphony.com/functions"
                xmlns:func="http://exslt.org/functions"
                extension-element-prefixes="func">

    <!--
     #String utility functions (yes, functions)

     	version:  1.03
     	author:   Simon de Turck
     	email:    simon@zimmen.com


     To use these functions add the string namespace to your master (or wherever you feel it suits best) stylesheet and import this utility. Add the namespace `xmlns:string="http://www.getsymphony.com/functions"` to all stylesheets where you want to use these functions.

     *This utility uses some **EXSLT** that is supported in libxslt 1.0.19 and later*

     Usage:

     ####Convert string to lowercase:
     	<xsl:value-of select="string:lower-case([selector])" />

     ######example:
     	<xsl:value-of select="string:lower-case('ABC')" />

     	abc

     ####Convert string to uppercase:
     	<xsl:value-of select="string:upper-case([selector])" />

     ######example:
     	<xsl:value-of select="string:upper-case('abc')" />

     	ABC

     ####Capitalize string:
     	<xsl:value-of select="capitalize([selector])" />
     	<xsl:value-of select="ucfirst([selector])" /> (alias)

     ######example:
     	<xsl:value-of select="capitalize('the t in this sentence is capitalized!')" />

         The t in this sentence is capitalized!

     ####Capitalize each word in a string:
     	<xsl:value-of select="capitalize-words([selector])" />
     	<xsl:value-of select="ucall([selector])" /> (alias)

     ######example:
     	<xsl:value-of select="capitalize-words('all words in this sentence are capitalized!')" />

         All Words In This Sentence Are Capitalized !

     ####Replace in string:
     	<xsl:value-of select="string:replace([selector],[needle],[replace])" />

     ######example:
     	<xsl:value-of select="string:replace('a b c',' ',' to the ')" />

     	a to the b to the c

     ####Split a string (returns a nodeset):
     	<xsl:copy-of select="string:split([selector][,[delimiter],[rootnodename],[nodename]])" />

     - Default delimiter: ','
     - Default rootnodename: 'nodeset'
     - Default nodename: 'node'

     ######example 1:
     	<xsl:copy-of select="string:split('a,b,c')" />

     	<nodeset>
         	<node>a</node>
         	<node>b</node>
         	<node>c</node>
     	</nodeset>

     ######example 2:
     	<xsl:copy-of select="string:split('book1#book2#book3','#','bookstore','book')" />

     	<bookstore>
     		<book>book1</book>
     		<book>book2</book>
     		<book>book3</book>
     	</bookstore>

     ######example 3:
     	<xsl:copy-of select="string:split('item1#item2#item3','#','ul','li')" />

     	<ul>
     		<li>book1</li>
     	    <li>book2</li>
     	    <li>book3</li>
     	</ul>

     ####Count occurrences of a string in a string:
     **To count elements (lets say `<a href>`'s in your text fields) you should use `count(text/*/a)` instead.**

     	<xsl:value-of select="string:substring-count([needle],[haystack])" />

     ######example
     	<xsl:value-of select="string:substring-count('the quick brown fox jumps over the lazy dog','the')" />

     	2
     -->

    <!-- Convert string to lowercase -->
    <func:function name="string:lower-case">
        <xsl:param name="in" />
        <func:result select="translate($in,'ABCDEFGHIJKLMNOPQRSTUVWXYZÀÈÌÒÙÁÉÍÓÚÝÂÊÎÔÛÃÑÕÄËÏÖÜŸÅÆŒÇÐØ','abcdefghijklmnopqrstuvwxyzàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðø')" />
    </func:function>

    <!-- Convert string to uppercase -->
    <func:function name="string:upper-case">
        <xsl:param name="in" />
        <func:result select="translate($in,'abcdefghijklmnopqrstuvwxyzàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðø','ABCDEFGHIJKLMNOPQRSTUVWXYZÀÈÌÒÙÁÉÍÓÚÝÂÊÎÔÛÃÑÕÄËÏÖÜŸÅÆŒÇÐØ')" />
    </func:function>

    <!-- Capitalize first letter in string -->
    <func:function name="string:capitalize">
        <xsl:param name="in" />
        <func:result>
            <xsl:copy-of select="string:upper-case(substring($in, 1, 1))" />
            <xsl:copy-of select="string:lower-case(substring($in, 2))" />
        </func:result>
    </func:function>
    <!-- Alias for capitalize string -->
    <func:function name="string:ucfirst">
        <xsl:param name="in" />
        <func:result>
            <xsl:value-of select="string:capitalize($in)" />
        </func:result>
    </func:function>

    <!-- Capitalize all words in string -->
    <func:function name="string:capitalize-words">
        <xsl:param name="in" />
        <func:result>
            <xsl:value-of select="_string:grabword($in,' ')"/>
        </func:result>
    </func:function>
    <func:function name="_string:grabword">
        <xsl:param name="haystack" />
        <xsl:param name="needle" />
        <func:result>
            <xsl:choose>
                <xsl:when test="contains($haystack, $needle)">
                    <xsl:value-of select="concat(string:capitalize(substring-before($haystack, $needle)),$needle)" />
                    <xsl:copy-of select="_string:grabword(substring-after($haystack, $needle),$needle)" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="concat(string:capitalize($haystack), $needle)" />
                </xsl:otherwise>
            </xsl:choose>
        </func:result>
    </func:function>

    <!-- Replace a string within a string (or find the needle in the haystack and replace it) -->
    <func:function name="string:replace">
        <xsl:param name="in" />
        <xsl:param name="needle" />
        <xsl:param name="replace" select="''" />
        <func:result>
            <xsl:choose>
                <xsl:when test="contains($in, $needle)">
                    <xsl:value-of select="substring-before($in, $needle)" />
                    <xsl:value-of select="$replace" />
                    <xsl:value-of select="string:replace(substring-after($in, $needle),$needle,$replace)" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$in" />
                </xsl:otherwise>
            </xsl:choose>
        </func:result>
    </func:function>

    <!-- Splits a string and returns a nodeset -->
    <func:function name="string:split">
        <xsl:param name="in" />
        <xsl:param name="delim" select="','" />
        <xsl:param name="rootnode" select="'nodeset'" />
        <xsl:param name="nodename" select="'node'" />
        <func:result>
            <xsl:element name="{$rootnode}">
                <xsl:copy-of select="_string:createnodes($in,$delim,$nodename)" />
            </xsl:element>
        </func:result>
    </func:function>
    <func:function name="_string:createnodes">
        <xsl:param name="haystack" />
        <xsl:param name="needle" />
        <xsl:param name="nodename" select="'node'" />
        <func:result>
            <xsl:choose>
                <xsl:when test="contains($haystack, $needle)">
                    <xsl:element name="{$nodename}">
                        <xsl:value-of select="substring-before($haystack, $needle)" />
                    </xsl:element>
                    <xsl:copy-of select="_string:createnodes(substring-after($haystack, $needle),$needle,$nodename)" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:element name="{$nodename}">
                        <xsl:value-of select="$haystack" />
                    </xsl:element>
                </xsl:otherwise>
            </xsl:choose>
        </func:result>
    </func:function>

    <!--Count occurrences of a string in a string-->
    <func:function name="string:substring-count">
        <xsl:param name="haystack" />
        <xsl:param name="needle" />
        <func:result>
            <xsl:choose>
                <xsl:when test="contains($haystack, $needle) and $haystack and $needle">
                    <xsl:variable name="count">
                        <xsl:copy-of select="string:substring-count(substring-after($haystack, $needle), $needle)" />
                    </xsl:variable>
                    <xsl:value-of select="$count + 1" />
                </xsl:when>
                <xsl:otherwise>0</xsl:otherwise>
            </xsl:choose>
        </func:result>
    </func:function>
</xsl:stylesheet>

Discuss this XSLT Utility

Symphony • Open Source XSLT CMS

Server Requirements

  • PHP 5.3-5.6 or 7.0-7.3
  • PHP's LibXML module, with the XSLT extension enabled (--with-xsl)
  • MySQL 5.5 or above
  • An Apache or Litespeed webserver
  • Apache's mod_rewrite module or equivalent

Compatible Hosts

Sign in

Login details