root/tags/2.2.0RC2/etc/str.replace.function.xsl

Revision 1, 4.5 kB (checked in by hans, 3 years ago)

Initial checkin

  • Property svn:executable set to *
Line 
1 <?xml version="1.0"?>
2 <xsl:stylesheet version="1.0"
3                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4                 xmlns:str="http://exslt.org/strings"
5                 xmlns:func="http://exslt.org/functions"
6                 xmlns:exsl="http://exslt.org/common"
7                 extension-element-prefixes="str exsl func">
8
9 <func:function name="str:replace">
10         <xsl:param name="string" select="''" />
11    <xsl:param name="search" select="/.." />
12    <xsl:param name="replace" select="/.." />
13    <xsl:choose>
14       <xsl:when test="not($string)">
15         <func:result select="/.." />
16       </xsl:when>
17       <xsl:when test="function-available('exsl:node-set')">
18          <!-- this converts the search and replace arguments to node sets
19               if they are one of the other XPath types -->
20          <xsl:variable name="search-nodes-rtf">
21            <xsl:copy-of select="$search" />
22          </xsl:variable>
23          <xsl:variable name="replace-nodes-rtf">
24            <xsl:copy-of select="$replace" />
25          </xsl:variable>
26          <xsl:variable name="replacements-rtf">
27             <xsl:for-each select="exsl:node-set($search-nodes-rtf)/node()">
28                <xsl:variable name="pos" select="position()" />
29                <replace search="{.}">
30                   <xsl:copy-of select="exsl:node-set($replace-nodes-rtf)/node()[$pos]" />
31                </replace>
32             </xsl:for-each>
33          </xsl:variable>
34          <xsl:variable name="sorted-replacements-rtf">
35             <xsl:for-each select="exsl:node-set($replacements-rtf)/replace">
36                <xsl:sort select="string-length(@search)" data-type="number" order="descending" />
37                <xsl:copy-of select="." />
38             </xsl:for-each>
39          </xsl:variable>
40          <xsl:variable name="result">
41            <xsl:choose>
42               <xsl:when test="not($search)">
43                 <xsl:value-of select="$string" />
44               </xsl:when>
45              <xsl:otherwise>
46                <xsl:call-template name="str:_replace">
47                   <xsl:with-param name="string" select="$string" />
48                   <xsl:with-param name="replacements" select="exsl:node-set($sorted-replacements-rtf)/replace" />
49                </xsl:call-template>
50              </xsl:otherwise>
51            </xsl:choose>
52          </xsl:variable>
53          <func:result select="exsl:node-set($result)/node()" />
54       </xsl:when>
55       <xsl:otherwise>
56          <xsl:message terminate="yes">
57             ERROR: function implementation of str:replace() relies on exsl:node-set().
58          </xsl:message>
59       </xsl:otherwise>
60    </xsl:choose>
61 </func:function>
62
63 <xsl:template name="str:_replace">
64   <xsl:param name="string" select="''" />
65   <xsl:param name="replacements" select="/.." />
66   <xsl:choose>
67     <xsl:when test="not($string)" />
68     <xsl:when test="not($replacements)">
69       <xsl:value-of select="$string" />
70     </xsl:when>
71     <xsl:otherwise>
72       <xsl:variable name="replacement" select="$replacements[1]" />
73       <xsl:variable name="search" select="$replacement/@search" />
74       <xsl:choose>
75         <xsl:when test="not(string($search))">
76           <xsl:value-of select="substring($string, 1, 1)" />
77           <xsl:copy-of select="$replacement/node()" />
78           <xsl:call-template name="str:_replace">
79             <xsl:with-param name="string" select="substring($string, 2)" />
80             <xsl:with-param name="replacements" select="$replacements" />
81           </xsl:call-template>
82         </xsl:when>
83         <xsl:when test="contains($string, $search)">
84           <xsl:call-template name="str:_replace">
85             <xsl:with-param name="string" select="substring-before($string, $search)" />
86             <xsl:with-param name="replacements" select="$replacements[position() > 1]" />
87           </xsl:call-template>     
88           <xsl:copy-of select="$replacement/node()" />
89           <xsl:call-template name="str:_replace">
90             <xsl:with-param name="string" select="substring-after($string, $search)" />
91             <xsl:with-param name="replacements" select="$replacements" />
92           </xsl:call-template>
93         </xsl:when>
94         <xsl:otherwise>
95           <xsl:call-template name="str:_replace">
96             <xsl:with-param name="string" select="$string" />
97             <xsl:with-param name="replacements" select="$replacements[position() > 1]" />
98           </xsl:call-template>
99         </xsl:otherwise>
100       </xsl:choose>
101     </xsl:otherwise>
102   </xsl:choose>
103 </xsl:template>
104
105 </xsl:stylesheet>
Note: See TracBrowser for help on using the browser.