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