Statistiques
| Révision :

root / tei / xsl / functx-1.0-doc-2007-01.xsl @ 2

Historique | Voir | Annoter | Télécharger (96,71 ko)

1 2 mingarao
2 2 mingarao
<!--
3 2 mingarao
4 2 mingarao
 ********************************
5 2 mingarao
 The FunctX XSLT Function Library
6 2 mingarao
 ********************************
7 2 mingarao
8 2 mingarao
 Copyright (C) 2007 Datypic
9 2 mingarao
10 2 mingarao
 This library is free software; you can redistribute it and/or
11 2 mingarao
 modify it under the terms of the GNU Lesser General Public
12 2 mingarao
 License as published by the Free Software Foundation; either
13 2 mingarao
 version 2.1 of the License.
14 2 mingarao
15 2 mingarao
 This library is distributed in the hope that it will be useful,
16 2 mingarao
 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 2 mingarao
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 2 mingarao
 Lesser General Public License for more details.
19 2 mingarao
20 2 mingarao
 You should have received a copy of the GNU Lesser General Public
21 2 mingarao
 License along with this library; if not, write to the Free Software
22 2 mingarao
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
23 2 mingarao
24 2 mingarao
 For more information on the FunctX XSLT library, contact contrib@functx.com.
25 2 mingarao
26 2 mingarao
 @version 1.0
27 2 mingarao
 @see     http://www.xsltfunctions.com
28 2 mingarao
-->
29 2 mingarao
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
30 2 mingarao
                xmlns:dxmlf="http://www.datypic.com/xmlf"
31 2 mingarao
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
32 2 mingarao
                xmlns:fn="http://www.w3.org/2005/xpath-functions"
33 2 mingarao
                xmlns:local="http://www.datypic.com/local"
34 2 mingarao
                 xmlns:functx="http://www.functx.com"
35 2 mingarao
                exclude-result-prefixes="dxmlf xs" version="2.0">
36 2 mingarao
37 2 mingarao
<!--
38 2 mingarao
  Adds attributes to XML elements
39 2 mingarao
40 2 mingarao
 @author  Priscilla Walmsley, Datypic
41 2 mingarao
 @version 1.0
42 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_add-attributes.html
43 2 mingarao
 @param   $elements the element(s) to which you wish to add the attribute
44 2 mingarao
 @param   $attrNames the name(s) of the attribute(s) to add
45 2 mingarao
 @param   $attrValues the value(s) of the attribute(s) to add
46 2 mingarao
-->
47 2 mingarao
<xsl:function name="functx:add-attributes" as="element()?"
48 2 mingarao
              xmlns:functx="http://www.functx.com" >
49 2 mingarao
  <xsl:param name="elements" as="element()*"/>
50 2 mingarao
  <xsl:param name="attrNames" as="xs:QName*"/>
51 2 mingarao
  <xsl:param name="attrValues" as="xs:anyAtomicType*"/>
52 2 mingarao
53 2 mingarao
  <xsl:for-each select="$elements">
54 2 mingarao
    <xsl:variable name="element" select="."/>
55 2 mingarao
    <xsl:copy>
56 2 mingarao
      <xsl:for-each select="$attrNames">
57 2 mingarao
        <xsl:variable name="seq" select="position()"/>
58 2 mingarao
        <xsl:if test="not($element/@*[node-name(.) = current()])">
59 2 mingarao
          <xsl:attribute name="{.}"
60 2 mingarao
                         namespace="{namespace-uri-from-QName(.)}"
61 2 mingarao
                         select="$attrValues[$seq]"/>
62 2 mingarao
        </xsl:if>
63 2 mingarao
      </xsl:for-each>
64 2 mingarao
      <xsl:copy-of select="@*|node()"/>
65 2 mingarao
    </xsl:copy>
66 2 mingarao
  </xsl:for-each>
67 2 mingarao
68 2 mingarao
</xsl:function>
69 2 mingarao
70 2 mingarao
71 2 mingarao
<!--
72 2 mingarao
  Adds months to a date
73 2 mingarao
74 2 mingarao
 @author  Priscilla Walmsley, Datypic
75 2 mingarao
 @version 1.0
76 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_add-months.html
77 2 mingarao
 @param   $date the date
78 2 mingarao
 @param   $months the number of months to add
79 2 mingarao
-->
80 2 mingarao
<xsl:function name="functx:add-months" as="xs:date?"
81 2 mingarao
              xmlns:functx="http://www.functx.com" >
82 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
83 2 mingarao
  <xsl:param name="months" as="xs:integer"/>
84 2 mingarao
85 2 mingarao
  <xsl:sequence select="
86 2 mingarao
   xs:date($date) + functx:yearMonthDuration(0,$months)
87 2 mingarao
 "/>
88 2 mingarao
89 2 mingarao
</xsl:function>
90 2 mingarao
91 2 mingarao
92 2 mingarao
<!--
93 2 mingarao
  Adds attributes to XML elements
94 2 mingarao
95 2 mingarao
 @author  Priscilla Walmsley, Datypic
96 2 mingarao
 @version 1.0
97 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_add-or-update-attributes.html
98 2 mingarao
 @param   $elements the element(s) to which you wish to add the attribute
99 2 mingarao
 @param   $attrNames the name(s) of the attribute(s) to add
100 2 mingarao
 @param   $attrValues the value(s) of the attribute(s) to add
101 2 mingarao
-->
102 2 mingarao
<xsl:function name="functx:add-or-update-attributes" as="element()?"
103 2 mingarao
              xmlns:functx="http://www.functx.com" >
104 2 mingarao
  <xsl:param name="elements" as="element()*"/>
105 2 mingarao
  <xsl:param name="attrNames" as="xs:QName*"/>
106 2 mingarao
  <xsl:param name="attrValues" as="xs:anyAtomicType*"/>
107 2 mingarao
108 2 mingarao
  <xsl:for-each select="$elements">
109 2 mingarao
    <xsl:copy>
110 2 mingarao
      <xsl:for-each select="$attrNames">
111 2 mingarao
        <xsl:variable name="seq" select="position()"/>
112 2 mingarao
        <xsl:attribute name="{.}"
113 2 mingarao
                       namespace="{namespace-uri-from-QName(.)}"
114 2 mingarao
                       select="$attrValues[$seq]"/>
115 2 mingarao
      </xsl:for-each>
116 2 mingarao
      <xsl:copy-of select="@*[not(node-name(.) = $attrNames)]|node()"/>
117 2 mingarao
    </xsl:copy>
118 2 mingarao
  </xsl:for-each>
119 2 mingarao
120 2 mingarao
</xsl:function>
121 2 mingarao
122 2 mingarao
123 2 mingarao
<!--
124 2 mingarao
  Whether a value is all whitespace or a zero-length string
125 2 mingarao
126 2 mingarao
 @author  Priscilla Walmsley, Datypic
127 2 mingarao
 @version 1.0
128 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_all-whitespace.html
129 2 mingarao
 @param   $arg the string (or node) to test
130 2 mingarao
-->
131 2 mingarao
<xsl:function name="functx:all-whitespace" as="xs:boolean"
132 2 mingarao
              xmlns:functx="http://www.functx.com" >
133 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
134 2 mingarao
135 2 mingarao
  <xsl:sequence select="
136 2 mingarao
   normalize-space($arg) = ''
137 2 mingarao
 "/>
138 2 mingarao
139 2 mingarao
</xsl:function>
140 2 mingarao
141 2 mingarao
142 2 mingarao
<!--
143 2 mingarao
  Whether all the values in a sequence are distinct
144 2 mingarao
145 2 mingarao
 @author  Priscilla Walmsley, Datypic
146 2 mingarao
 @version 1.0
147 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_are-distinct-values.html
148 2 mingarao
 @param   $seq the sequence of values
149 2 mingarao
-->
150 2 mingarao
<xsl:function name="functx:are-distinct-values" as="xs:boolean"
151 2 mingarao
              xmlns:functx="http://www.functx.com" >
152 2 mingarao
  <xsl:param name="seq" as="xs:anyAtomicType*"/>
153 2 mingarao
154 2 mingarao
  <xsl:sequence select="
155 2 mingarao
   count(distinct-values($seq)) = count($seq)
156 2 mingarao
 "/>
157 2 mingarao
158 2 mingarao
</xsl:function>
159 2 mingarao
160 2 mingarao
161 2 mingarao
<!--
162 2 mingarao
  The built-in type of an atomic value
163 2 mingarao
164 2 mingarao
 @author  Priscilla Walmsley, Datypic
165 2 mingarao
 @version 1.0
166 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_atomic-type.html
167 2 mingarao
 @param   $values the value(s) whose type you want to determine
168 2 mingarao
-->
169 2 mingarao
<xsl:function name="functx:atomic-type" as="xs:string*"
170 2 mingarao
              xmlns:functx="http://www.functx.com" >
171 2 mingarao
  <xsl:param name="values" as="xs:anyAtomicType*"/>
172 2 mingarao
173 2 mingarao
  <xsl:sequence select="
174 2 mingarao
 for $val in $values
175 2 mingarao
 return
176 2 mingarao
 (if ($val instance of xs:untypedAtomic) then 'xs:untypedAtomic'
177 2 mingarao
 else if ($val instance of xs:anyURI) then 'xs:anyURI'
178 2 mingarao
 else if ($val instance of xs:string) then 'xs:string'
179 2 mingarao
 else if ($val instance of xs:QName) then 'xs:QName'
180 2 mingarao
 else if ($val instance of xs:boolean) then 'xs:boolean'
181 2 mingarao
 else if ($val instance of xs:base64Binary) then 'xs:base64Binary'
182 2 mingarao
 else if ($val instance of xs:hexBinary) then 'xs:hexBinary'
183 2 mingarao
 else if ($val instance of xs:integer) then 'xs:integer'
184 2 mingarao
 else if ($val instance of xs:decimal) then 'xs:decimal'
185 2 mingarao
 else if ($val instance of xs:float) then 'xs:float'
186 2 mingarao
 else if ($val instance of xs:double) then 'xs:double'
187 2 mingarao
 else if ($val instance of xs:date) then 'xs:date'
188 2 mingarao
 else if ($val instance of xs:time) then 'xs:time'
189 2 mingarao
 else if ($val instance of xs:dateTime) then 'xs:dateTime'
190 2 mingarao
 else if ($val instance of xs:dayTimeDuration)
191 2 mingarao
         then 'xs:dayTimeDuration'
192 2 mingarao
 else if ($val instance of xs:yearMonthDuration)
193 2 mingarao
         then 'xs:yearMonthDuration'
194 2 mingarao
 else if ($val instance of xs:duration) then 'xs:duration'
195 2 mingarao
 else if ($val instance of xs:gMonth) then 'xs:gMonth'
196 2 mingarao
 else if ($val instance of xs:gYear) then 'xs:gYear'
197 2 mingarao
 else if ($val instance of xs:gYearMonth) then 'xs:gYearMonth'
198 2 mingarao
 else if ($val instance of xs:gDay) then 'xs:gDay'
199 2 mingarao
 else if ($val instance of xs:gMonthDay) then 'xs:gMonthDay'
200 2 mingarao
 else 'unknown')
201 2 mingarao
 "/>
202 2 mingarao
203 2 mingarao
</xsl:function>
204 2 mingarao
205 2 mingarao
206 2 mingarao
<!--
207 2 mingarao
  The average, counting "empty" values as zero
208 2 mingarao
209 2 mingarao
 @author  Priscilla Walmsley, Datypic
210 2 mingarao
 @version 1.0
211 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_avg-empty-is-zero.html
212 2 mingarao
 @param   $values the values to be averaged
213 2 mingarao
 @param   $allNodes the sequence of all nodes to find the average over
214 2 mingarao
-->
215 2 mingarao
<xsl:function name="functx:avg-empty-is-zero" as="xs:double"
216 2 mingarao
              xmlns:functx="http://www.functx.com" >
217 2 mingarao
  <xsl:param name="values" as="xs:anyAtomicType*"/>
218 2 mingarao
  <xsl:param name="allNodes" as="node()*"/>
219 2 mingarao
220 2 mingarao
  <xsl:sequence select="
221 2 mingarao
   if (empty($allNodes))
222 2 mingarao
   then 0
223 2 mingarao
   else sum($values[string(.) != '']) div count($allNodes)
224 2 mingarao
 "/>
225 2 mingarao
226 2 mingarao
</xsl:function>
227 2 mingarao
228 2 mingarao
229 2 mingarao
<!--
230 2 mingarao
  Whether a value is between two provided values
231 2 mingarao
232 2 mingarao
 @author  Priscilla Walmsley, Datypic
233 2 mingarao
 @version 1.0
234 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_between-exclusive.html
235 2 mingarao
 @param   $value the value to be tested
236 2 mingarao
 @param   $minValue the minimum value
237 2 mingarao
 @param   $maxValue the maximum value
238 2 mingarao
-->
239 2 mingarao
<xsl:function name="functx:between-exclusive" as="xs:boolean"
240 2 mingarao
              xmlns:functx="http://www.functx.com" >
241 2 mingarao
  <xsl:param name="value" as="xs:anyAtomicType?"/>
242 2 mingarao
  <xsl:param name="minValue" as="xs:anyAtomicType"/>
243 2 mingarao
  <xsl:param name="maxValue" as="xs:anyAtomicType"/>
244 2 mingarao
245 2 mingarao
  <xsl:sequence select="
246 2 mingarao
   $value > $minValue and $value &lt; $maxValue
247 2 mingarao
 "/>
248 2 mingarao
249 2 mingarao
</xsl:function>
250 2 mingarao
251 2 mingarao
252 2 mingarao
<!--
253 2 mingarao
  Whether a value is between two provided values, or equal to one of them
254 2 mingarao
255 2 mingarao
 @author  Priscilla Walmsley, Datypic
256 2 mingarao
 @version 1.0
257 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_between-inclusive.html
258 2 mingarao
 @param   $value the value to be tested
259 2 mingarao
 @param   $minValue the minimum value
260 2 mingarao
 @param   $maxValue the maximum value
261 2 mingarao
-->
262 2 mingarao
<xsl:function name="functx:between-inclusive" as="xs:boolean"
263 2 mingarao
              xmlns:functx="http://www.functx.com" >
264 2 mingarao
  <xsl:param name="value" as="xs:anyAtomicType?"/>
265 2 mingarao
  <xsl:param name="minValue" as="xs:anyAtomicType"/>
266 2 mingarao
  <xsl:param name="maxValue" as="xs:anyAtomicType"/>
267 2 mingarao
268 2 mingarao
  <xsl:sequence select="
269 2 mingarao
   $value >= $minValue and $value &lt;= $maxValue
270 2 mingarao
 "/>
271 2 mingarao
272 2 mingarao
</xsl:function>
273 2 mingarao
274 2 mingarao
275 2 mingarao
<!--
276 2 mingarao
  Turns a camelCase string into space-separated words
277 2 mingarao
278 2 mingarao
 @author  Priscilla Walmsley, Datypic
279 2 mingarao
 @version 1.0
280 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_camel-case-to-words.html
281 2 mingarao
 @param   $arg the string to modify
282 2 mingarao
 @param   $delim the delimiter for the words (e.g. a space)
283 2 mingarao
-->
284 2 mingarao
<xsl:function name="functx:camel-case-to-words" as="xs:string"
285 2 mingarao
              xmlns:functx="http://www.functx.com" >
286 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
287 2 mingarao
  <xsl:param name="delim" as="xs:string"/>
288 2 mingarao
289 2 mingarao
  <xsl:sequence select="
290 2 mingarao
   concat(substring($arg,1,1),
291 2 mingarao
             replace(substring($arg,2),'(\p{Lu})',
292 2 mingarao
                        concat($delim, '$1')))
293 2 mingarao
 "/>
294 2 mingarao
295 2 mingarao
</xsl:function>
296 2 mingarao
297 2 mingarao
298 2 mingarao
<!--
299 2 mingarao
  Capitalizes the first character of a string
300 2 mingarao
301 2 mingarao
 @author  Priscilla Walmsley, Datypic
302 2 mingarao
 @version 1.0
303 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_capitalize-first.html
304 2 mingarao
 @param   $arg the word or phrase to capitalize
305 2 mingarao
-->
306 2 mingarao
<xsl:function name="functx:capitalize-first" as="xs:string?"
307 2 mingarao
              xmlns:functx="http://www.functx.com" >
308 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
309 2 mingarao
310 2 mingarao
  <xsl:sequence select="
311 2 mingarao
   concat(upper-case(substring($arg,1,1)),
312 2 mingarao
             substring($arg,2))
313 2 mingarao
 "/>
314 2 mingarao
315 2 mingarao
</xsl:function>
316 2 mingarao
317 2 mingarao
318 2 mingarao
<!--
319 2 mingarao
  Changes the names of elements in an XML fragment
320 2 mingarao
321 2 mingarao
 @author  Priscilla Walmsley, Datypic
322 2 mingarao
 @version 1.0
323 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_change-element-names-deep.html
324 2 mingarao
 @param   $nodes the element(s) to change
325 2 mingarao
 @param   $oldNames the sequence of names to change from
326 2 mingarao
 @param   $newNames the sequence of names to change to
327 2 mingarao
-->
328 2 mingarao
<xsl:function name="functx:change-element-names-deep" as="node()*"
329 2 mingarao
              xmlns:functx="http://www.functx.com" >
330 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
331 2 mingarao
  <xsl:param name="oldNames" as="xs:QName*"/>
332 2 mingarao
  <xsl:param name="newNames" as="xs:QName*"/>
333 2 mingarao
334 2 mingarao
  <xsl:if test="count($oldNames) != count($newNames)">
335 2 mingarao
    <xsl:sequence select="error(
336 2 mingarao
         xs:QName('functx:Different_number_of_names'))"/>
337 2 mingarao
  </xsl:if>
338 2 mingarao
  <xsl:for-each select="$nodes">
339 2 mingarao
    <xsl:variable name="node" select="."/>
340 2 mingarao
    <xsl:choose>
341 2 mingarao
      <xsl:when test="$node instance of element()">
342 2 mingarao
        <xsl:variable name="theName"
343 2 mingarao
                      select="functx:if-empty
344 2 mingarao
                    ($newNames[index-of($oldNames, node-name($node))],
345 2 mingarao
                     node-name($node))"/>
346 2 mingarao
        <xsl:element name="{$theName}"
347 2 mingarao
                     namespace="{namespace-uri-from-QName($theName)}" >
348 2 mingarao
           <xsl:sequence select="($node/@*,
349 2 mingarao
                  functx:change-element-names-deep($node/node(),
350 2 mingarao
                                           $oldNames, $newNames))"/>
351 2 mingarao
        </xsl:element>
352 2 mingarao
      </xsl:when>
353 2 mingarao
      <xsl:when test="$node instance of document-node()">
354 2 mingarao
        <xsl:document>
355 2 mingarao
           <xsl:sequence select="functx:change-element-names-deep(
356 2 mingarao
                $node/node(), $oldNames, $newNames)"/>
357 2 mingarao
        </xsl:document>
358 2 mingarao
      </xsl:when>
359 2 mingarao
      <xsl:otherwise>
360 2 mingarao
        <xsl:sequence select="$node"/>
361 2 mingarao
      </xsl:otherwise>
362 2 mingarao
    </xsl:choose>
363 2 mingarao
  </xsl:for-each>
364 2 mingarao
365 2 mingarao
</xsl:function>
366 2 mingarao
367 2 mingarao
368 2 mingarao
<!--
369 2 mingarao
  Changes the namespace of XML elements and its descendants
370 2 mingarao
371 2 mingarao
 @author  Priscilla Walmsley, Datypic
372 2 mingarao
 @version 1.0
373 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_change-element-ns-deep.html
374 2 mingarao
 @param   $nodes the nodes to change
375 2 mingarao
 @param   $newns the new namespace
376 2 mingarao
 @param   $prefix the prefix to use for the new namespace
377 2 mingarao
-->
378 2 mingarao
<xsl:function name="functx:change-element-ns-deep" as="node()*"
379 2 mingarao
              xmlns:functx="http://www.functx.com" >
380 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
381 2 mingarao
  <xsl:param name="newns" as="xs:string"/>
382 2 mingarao
  <xsl:param name="prefix" as="xs:string"/>
383 2 mingarao
384 2 mingarao
  <xsl:for-each select="$nodes">
385 2 mingarao
    <xsl:variable name="node" select="."/>
386 2 mingarao
    <xsl:choose>
387 2 mingarao
      <xsl:when test="$node instance of element()">
388 2 mingarao
        <xsl:element name="{concat($prefix,
389 2 mingarao
                                    if ($prefix = '')
390 2 mingarao
                                    then ''
391 2 mingarao
                                    else ':',
392 2 mingarao
                                    local-name($node))}"
393 2 mingarao
                     namespace="{$newns}">
394 2 mingarao
          <xsl:sequence select="($node/@*,
395 2 mingarao
                functx:change-element-ns-deep($node/node(),
396 2 mingarao
                                           $newns, $prefix))"/>
397 2 mingarao
        </xsl:element>
398 2 mingarao
      </xsl:when>
399 2 mingarao
      <xsl:when test="$node instance of document-node()">
400 2 mingarao
        <xsl:document>
401 2 mingarao
          <xsl:sequence select="functx:change-element-ns-deep(
402 2 mingarao
                $node/node(), $newns, $prefix)"/>
403 2 mingarao
        </xsl:document>
404 2 mingarao
      </xsl:when>
405 2 mingarao
      <xsl:otherwise>
406 2 mingarao
        <xsl:sequence select="$node"/>
407 2 mingarao
      </xsl:otherwise>
408 2 mingarao
   </xsl:choose>
409 2 mingarao
  </xsl:for-each>
410 2 mingarao
411 2 mingarao
</xsl:function>
412 2 mingarao
413 2 mingarao
414 2 mingarao
<!--
415 2 mingarao
  Changes the namespace of XML elements
416 2 mingarao
417 2 mingarao
 @author  Priscilla Walmsley, Datypic
418 2 mingarao
 @version 1.0
419 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_change-element-ns.html
420 2 mingarao
 @param   $elements the elements to change
421 2 mingarao
 @param   $newns the new namespace
422 2 mingarao
 @param   $prefix the prefix to use for the new namespace
423 2 mingarao
-->
424 2 mingarao
<xsl:function name="functx:change-element-ns" as="element()?"
425 2 mingarao
              xmlns:functx="http://www.functx.com" >
426 2 mingarao
  <xsl:param name="elements" as="element()*"/>
427 2 mingarao
  <xsl:param name="newns" as="xs:string"/>
428 2 mingarao
  <xsl:param name="prefix" as="xs:string"/>
429 2 mingarao
430 2 mingarao
   <xsl:for-each select="$elements">
431 2 mingarao
     <xsl:variable name="element" select="."/>
432 2 mingarao
     <xsl:element name="{concat($prefix,
433 2 mingarao
                                    if ($prefix = '')
434 2 mingarao
                                    then ''
435 2 mingarao
                                    else ':',
436 2 mingarao
                                    local-name($element))}"
437 2 mingarao
                     namespace="{$newns}">
438 2 mingarao
       <xsl:sequence select="$element/@*, $element/node()"/>
439 2 mingarao
     </xsl:element>
440 2 mingarao
   </xsl:for-each>
441 2 mingarao
442 2 mingarao
</xsl:function>
443 2 mingarao
444 2 mingarao
445 2 mingarao
<!--
446 2 mingarao
  Converts a string to a sequence of characters
447 2 mingarao
448 2 mingarao
 @author  Priscilla Walmsley, Datypic
449 2 mingarao
 @version 1.0
450 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_chars.html
451 2 mingarao
 @param   $arg the string to split
452 2 mingarao
-->
453 2 mingarao
<xsl:function name="functx:chars" as="xs:string*"
454 2 mingarao
              xmlns:functx="http://www.functx.com" >
455 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
456 2 mingarao
457 2 mingarao
  <xsl:sequence select="
458 2 mingarao
   for $ch in string-to-codepoints($arg)
459 2 mingarao
   return codepoints-to-string($ch)
460 2 mingarao
 "/>
461 2 mingarao
462 2 mingarao
</xsl:function>
463 2 mingarao
464 2 mingarao
465 2 mingarao
<!--
466 2 mingarao
  Whether a string contains any of a sequence of strings
467 2 mingarao
468 2 mingarao
 @author  Priscilla Walmsley, Datypic
469 2 mingarao
 @version 1.0
470 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_contains-any-of.html
471 2 mingarao
 @param   $arg the string to test
472 2 mingarao
 @param   $searchStrings the strings to look for
473 2 mingarao
-->
474 2 mingarao
<xsl:function name="functx:contains-any-of" as="xs:boolean"
475 2 mingarao
              xmlns:functx="http://www.functx.com" >
476 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
477 2 mingarao
  <xsl:param name="searchStrings" as="xs:string*"/>
478 2 mingarao
479 2 mingarao
  <xsl:sequence select="
480 2 mingarao
   some $searchString in $searchStrings
481 2 mingarao
   satisfies contains($arg,$searchString)
482 2 mingarao
 "/>
483 2 mingarao
484 2 mingarao
</xsl:function>
485 2 mingarao
486 2 mingarao
487 2 mingarao
<!--
488 2 mingarao
  Whether one string contains another, without regard to case
489 2 mingarao
490 2 mingarao
 @author  Priscilla Walmsley, Datypic
491 2 mingarao
 @version 1.0
492 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_contains-case-insensitive.html
493 2 mingarao
 @param   $arg the string to search
494 2 mingarao
 @param   $substring the substring to find
495 2 mingarao
-->
496 2 mingarao
<xsl:function name="functx:contains-case-insensitive" as="xs:boolean?"
497 2 mingarao
              xmlns:functx="http://www.functx.com" >
498 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
499 2 mingarao
  <xsl:param name="substring" as="xs:string"/>
500 2 mingarao
501 2 mingarao
  <xsl:sequence select="
502 2 mingarao
   contains(upper-case($arg), upper-case($substring))
503 2 mingarao
 "/>
504 2 mingarao
505 2 mingarao
</xsl:function>
506 2 mingarao
507 2 mingarao
508 2 mingarao
<!--
509 2 mingarao
  Whether one string contains another, as a separate word
510 2 mingarao
511 2 mingarao
 @author  Priscilla Walmsley, Datypic
512 2 mingarao
 @version 1.0
513 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_contains-word.html
514 2 mingarao
 @param   $arg the string to search
515 2 mingarao
 @param   $word the word to find
516 2 mingarao
-->
517 2 mingarao
<xsl:function name="functx:contains-word" as="xs:boolean"
518 2 mingarao
              xmlns:functx="http://www.functx.com" >
519 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
520 2 mingarao
  <xsl:param name="word" as="xs:string"/>
521 2 mingarao
522 2 mingarao
  <xsl:sequence select="
523 2 mingarao
   matches(upper-case($arg),
524 2 mingarao
           concat('^(.*\W)?',
525 2 mingarao
                     upper-case(functx:escape-for-regex($word)),
526 2 mingarao
                     '(\W.*)?$'))
527 2 mingarao
 "/>
528 2 mingarao
529 2 mingarao
</xsl:function>
530 2 mingarao
531 2 mingarao
532 2 mingarao
<!--
533 2 mingarao
  Copies attributes from one element to another
534 2 mingarao
535 2 mingarao
 @author  Priscilla Walmsley, Datypic
536 2 mingarao
 @version 1.0
537 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_copy-attributes.html
538 2 mingarao
 @param   $copyTo the element to copy attributes to
539 2 mingarao
 @param   $copyFrom the element to copy attributes from
540 2 mingarao
-->
541 2 mingarao
<xsl:function name="functx:copy-attributes" as="element()"
542 2 mingarao
              xmlns:functx="http://www.functx.com" >
543 2 mingarao
  <xsl:param name="copyTo" as="element()"/>
544 2 mingarao
  <xsl:param name="copyFrom" as="element()"/>
545 2 mingarao
546 2 mingarao
  <xsl:element name="{node-name($copyTo)}">
547 2 mingarao
    <xsl:sequence select="
548 2 mingarao
       ($copyTo/@*[not(node-name(.) = $copyFrom/@*/node-name(.))],
549 2 mingarao
        $copyFrom/@*,
550 2 mingarao
        $copyTo/node())"/>
551 2 mingarao
  </xsl:element>
552 2 mingarao
553 2 mingarao
</xsl:function>
554 2 mingarao
555 2 mingarao
556 2 mingarao
<!--
557 2 mingarao
  Construct a date from a year, month and day
558 2 mingarao
559 2 mingarao
 @author  Priscilla Walmsley, Datypic
560 2 mingarao
 @version 1.0
561 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_date.html
562 2 mingarao
 @param   $year the year
563 2 mingarao
 @param   $month the month
564 2 mingarao
 @param   $day the day
565 2 mingarao
-->
566 2 mingarao
<xsl:function name="functx:date" as="xs:date"
567 2 mingarao
              xmlns:functx="http://www.functx.com" >
568 2 mingarao
  <xsl:param name="year" as="xs:anyAtomicType"/>
569 2 mingarao
  <xsl:param name="month" as="xs:anyAtomicType"/>
570 2 mingarao
  <xsl:param name="day" as="xs:anyAtomicType"/>
571 2 mingarao
572 2 mingarao
  <xsl:sequence select="
573 2 mingarao
   xs:date(
574 2 mingarao
     concat(
575 2 mingarao
       functx:pad-integer-to-length(xs:integer($year),4),'-',
576 2 mingarao
       functx:pad-integer-to-length(xs:integer($month),2),'-',
577 2 mingarao
       functx:pad-integer-to-length(xs:integer($day),2)))
578 2 mingarao
 "/>
579 2 mingarao
580 2 mingarao
</xsl:function>
581 2 mingarao
582 2 mingarao
583 2 mingarao
<!--
584 2 mingarao
  Construct a date/time from individual components
585 2 mingarao
586 2 mingarao
 @author  Priscilla Walmsley, Datypic
587 2 mingarao
 @version 1.0
588 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_datetime.html
589 2 mingarao
 @param   $year the year
590 2 mingarao
 @param   $month the month
591 2 mingarao
 @param   $day the day
592 2 mingarao
 @param   $hour the hour
593 2 mingarao
 @param   $minute the minute
594 2 mingarao
 @param   $second the second
595 2 mingarao
-->
596 2 mingarao
<xsl:function name="functx:dateTime" as="xs:dateTime"
597 2 mingarao
              xmlns:functx="http://www.functx.com" >
598 2 mingarao
  <xsl:param name="year" as="xs:anyAtomicType"/>
599 2 mingarao
  <xsl:param name="month" as="xs:anyAtomicType"/>
600 2 mingarao
  <xsl:param name="day" as="xs:anyAtomicType"/>
601 2 mingarao
  <xsl:param name="hour" as="xs:anyAtomicType"/>
602 2 mingarao
  <xsl:param name="minute" as="xs:anyAtomicType"/>
603 2 mingarao
  <xsl:param name="second" as="xs:anyAtomicType"/>
604 2 mingarao
605 2 mingarao
  <xsl:sequence select="
606 2 mingarao
   xs:dateTime(
607 2 mingarao
     concat(functx:date($year,$month,$day),'T',
608 2 mingarao
             functx:time($hour,$minute,$second)))
609 2 mingarao
 "/>
610 2 mingarao
611 2 mingarao
</xsl:function>
612 2 mingarao
613 2 mingarao
614 2 mingarao
<!--
615 2 mingarao
  The day of the year (a number between 1 and 366)
616 2 mingarao
617 2 mingarao
 @author  Priscilla Walmsley, Datypic
618 2 mingarao
 @version 1.0
619 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_day-in-year.html
620 2 mingarao
 @param   $date the date
621 2 mingarao
-->
622 2 mingarao
<xsl:function name="functx:day-in-year" as="xs:integer?"
623 2 mingarao
              xmlns:functx="http://www.functx.com" >
624 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
625 2 mingarao
626 2 mingarao
  <xsl:sequence select="
627 2 mingarao
  days-from-duration(
628 2 mingarao
      xs:date($date) - functx:first-day-of-year($date)) + 1
629 2 mingarao
 "/>
630 2 mingarao
631 2 mingarao
</xsl:function>
632 2 mingarao
633 2 mingarao
634 2 mingarao
<!--
635 2 mingarao
  The abbreviated day of the week, from a date, in English
636 2 mingarao
637 2 mingarao
 @author  Priscilla Walmsley, Datypic
638 2 mingarao
 @version 1.0
639 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_day-of-week-abbrev-en.html
640 2 mingarao
 @param   $date the date
641 2 mingarao
-->
642 2 mingarao
<xsl:function name="functx:day-of-week-abbrev-en" as="xs:string?"
643 2 mingarao
              xmlns:functx="http://www.functx.com" >
644 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
645 2 mingarao
646 2 mingarao
  <xsl:sequence select="
647 2 mingarao
   ('Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat')
648 2 mingarao
   [functx:day-of-week($date) + 1]
649 2 mingarao
 "/>
650 2 mingarao
651 2 mingarao
</xsl:function>
652 2 mingarao
653 2 mingarao
654 2 mingarao
<!--
655 2 mingarao
  The name of the day of the week, from a date, in English
656 2 mingarao
657 2 mingarao
 @author  Priscilla Walmsley, Datypic
658 2 mingarao
 @version 1.0
659 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_day-of-week-name-en.html
660 2 mingarao
 @param   $date the date
661 2 mingarao
-->
662 2 mingarao
<xsl:function name="functx:day-of-week-name-en" as="xs:string?"
663 2 mingarao
              xmlns:functx="http://www.functx.com" >
664 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
665 2 mingarao
666 2 mingarao
  <xsl:sequence select="
667 2 mingarao
   ('Sunday', 'Monday', 'Tuesday', 'Wednesday',
668 2 mingarao
    'Thursday', 'Friday', 'Saturday')
669 2 mingarao
      [functx:day-of-week($date) + 1]
670 2 mingarao
 "/>
671 2 mingarao
672 2 mingarao
</xsl:function>
673 2 mingarao
674 2 mingarao
675 2 mingarao
<!--
676 2 mingarao
  The day of the week, from a date
677 2 mingarao
678 2 mingarao
 @author  Priscilla Walmsley, Datypic
679 2 mingarao
 @version 1.0
680 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_day-of-week.html
681 2 mingarao
 @param   $date the date
682 2 mingarao
-->
683 2 mingarao
<xsl:function name="functx:day-of-week" as="xs:integer?"
684 2 mingarao
              xmlns:functx="http://www.functx.com" >
685 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
686 2 mingarao
687 2 mingarao
  <xsl:sequence select="
688 2 mingarao
  if (empty($date))
689 2 mingarao
  then ()
690 2 mingarao
  else xs:integer((xs:date($date) - xs:date('1901-01-06'))
691 2 mingarao
          div xs:dayTimeDuration('P1D')) mod 7
692 2 mingarao
 "/>
693 2 mingarao
694 2 mingarao
</xsl:function>
695 2 mingarao
696 2 mingarao
697 2 mingarao
<!--
698 2 mingarao
  Construct a dayTimeDuration from a number of days, hours, etc.
699 2 mingarao
700 2 mingarao
 @author  Priscilla Walmsley, Datypic
701 2 mingarao
 @version 1.0
702 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_daytimeduration.html
703 2 mingarao
 @param   $days the number of days
704 2 mingarao
 @param   $hours the number of hours
705 2 mingarao
 @param   $minutes the number of minutes
706 2 mingarao
 @param   $seconds the number of seconds
707 2 mingarao
-->
708 2 mingarao
<xsl:function name="functx:dayTimeDuration" as="xs:dayTimeDuration"
709 2 mingarao
              xmlns:functx="http://www.functx.com" >
710 2 mingarao
  <xsl:param name="days" as="xs:decimal?"/>
711 2 mingarao
  <xsl:param name="hours" as="xs:decimal?"/>
712 2 mingarao
  <xsl:param name="minutes" as="xs:decimal?"/>
713 2 mingarao
  <xsl:param name="seconds" as="xs:decimal?"/>
714 2 mingarao
715 2 mingarao
  <xsl:sequence select="
716 2 mingarao
    (xs:dayTimeDuration('P1D') * functx:if-empty($days,0)) +
717 2 mingarao
    (xs:dayTimeDuration('PT1H') * functx:if-empty($hours,0)) +
718 2 mingarao
    (xs:dayTimeDuration('PT1M') * functx:if-empty($minutes,0)) +
719 2 mingarao
    (xs:dayTimeDuration('PT1S') * functx:if-empty($seconds,0))
720 2 mingarao
 "/>
721 2 mingarao
722 2 mingarao
</xsl:function>
723 2 mingarao
724 2 mingarao
725 2 mingarao
<!--
726 2 mingarao
  Number of days in the month
727 2 mingarao
728 2 mingarao
 @author  Priscilla Walmsley, Datypic
729 2 mingarao
 @version 1.0
730 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_days-in-month.html
731 2 mingarao
 @param   $date the date
732 2 mingarao
-->
733 2 mingarao
<xsl:function name="functx:days-in-month" as="xs:integer?"
734 2 mingarao
              xmlns:functx="http://www.functx.com" >
735 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
736 2 mingarao
737 2 mingarao
  <xsl:sequence select="
738 2 mingarao
   if (month-from-date(xs:date($date)) = 2 and
739 2 mingarao
       functx:is-leap-year($date))
740 2 mingarao
   then 29
741 2 mingarao
   else
742 2 mingarao
   (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
743 2 mingarao
    [month-from-date(xs:date($date))]
744 2 mingarao
 "/>
745 2 mingarao
746 2 mingarao
</xsl:function>
747 2 mingarao
748 2 mingarao
749 2 mingarao
<!--
750 2 mingarao
  The depth (level) of a node in an XML tree
751 2 mingarao
752 2 mingarao
 @author  Priscilla Walmsley, Datypic
753 2 mingarao
 @version 1.0
754 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_depth-of-node.html
755 2 mingarao
 @param   $node the node to check
756 2 mingarao
-->
757 2 mingarao
<xsl:function name="functx:depth-of-node" as="xs:integer"
758 2 mingarao
              xmlns:functx="http://www.functx.com" >
759 2 mingarao
  <xsl:param name="node" as="node()?"/>
760 2 mingarao
761 2 mingarao
  <xsl:sequence select="
762 2 mingarao
   count($node/ancestor-or-self::node())
763 2 mingarao
 "/>
764 2 mingarao
765 2 mingarao
</xsl:function>
766 2 mingarao
767 2 mingarao
768 2 mingarao
<!--
769 2 mingarao
  The distinct names of all attributes in an XML fragment
770 2 mingarao
771 2 mingarao
 @author  Priscilla Walmsley, Datypic
772 2 mingarao
 @version 1.0
773 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_distinct-attribute-names.html
774 2 mingarao
 @param   $nodes the root to start from
775 2 mingarao
-->
776 2 mingarao
<xsl:function name="functx:distinct-attribute-names" as="xs:string*"
777 2 mingarao
              xmlns:functx="http://www.functx.com" >
778 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
779 2 mingarao
780 2 mingarao
  <xsl:sequence select="
781 2 mingarao
   distinct-values($nodes//@*/name(.))
782 2 mingarao
 "/>
783 2 mingarao
784 2 mingarao
</xsl:function>
785 2 mingarao
786 2 mingarao
787 2 mingarao
<!--
788 2 mingarao
  The XML nodes with distinct values, taking into account attributes and descendants
789 2 mingarao
790 2 mingarao
 @author  Priscilla Walmsley, Datypic
791 2 mingarao
 @version 1.0
792 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_distinct-deep.html
793 2 mingarao
 @param   $nodes the sequence of nodes to test
794 2 mingarao
-->
795 2 mingarao
<xsl:function name="functx:distinct-deep" as="node()*"
796 2 mingarao
              xmlns:functx="http://www.functx.com" >
797 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
798 2 mingarao
799 2 mingarao
  <xsl:sequence select="
800 2 mingarao
    for $seq in (1 to count($nodes))
801 2 mingarao
    return $nodes[$seq][not(functx:is-node-in-sequence-deep-equal(
802 2 mingarao
                          .,$nodes[position() &lt; $seq]))]
803 2 mingarao
 "/>
804 2 mingarao
805 2 mingarao
</xsl:function>
806 2 mingarao
807 2 mingarao
808 2 mingarao
<!--
809 2 mingarao
  The distinct names of all elements in an XML fragment
810 2 mingarao
811 2 mingarao
 @author  Priscilla Walmsley, Datypic
812 2 mingarao
 @version 1.0
813 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_distinct-element-names.html
814 2 mingarao
 @param   $nodes the root(s) to start from
815 2 mingarao
-->
816 2 mingarao
<xsl:function name="functx:distinct-element-names" as="xs:string*"
817 2 mingarao
              xmlns:functx="http://www.functx.com" >
818 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
819 2 mingarao
820 2 mingarao
  <xsl:sequence select="
821 2 mingarao
   distinct-values($nodes/descendant-or-self::*/name(.))
822 2 mingarao
 "/>
823 2 mingarao
824 2 mingarao
</xsl:function>
825 2 mingarao
826 2 mingarao
827 2 mingarao
<!--
828 2 mingarao
  The distinct paths of all descendant elements in an XML fragment
829 2 mingarao
830 2 mingarao
 @author  Priscilla Walmsley, Datypic
831 2 mingarao
 @version 1.0
832 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_distinct-element-paths.html
833 2 mingarao
 @param   $nodes the root(s) to start from
834 2 mingarao
-->
835 2 mingarao
<xsl:function name="functx:distinct-element-paths" as="xs:string*"
836 2 mingarao
              xmlns:functx="http://www.functx.com" >
837 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
838 2 mingarao
839 2 mingarao
  <xsl:sequence select="
840 2 mingarao
   distinct-values(functx:path-to-node($nodes/descendant-or-self::*))
841 2 mingarao
 "/>
842 2 mingarao
843 2 mingarao
</xsl:function>
844 2 mingarao
845 2 mingarao
846 2 mingarao
<!--
847 2 mingarao
  The distinct XML nodes in a sequence (by node identity)
848 2 mingarao
849 2 mingarao
 @author  Priscilla Walmsley, Datypic
850 2 mingarao
 @version 1.0
851 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_distinct-nodes.html
852 2 mingarao
 @param   $nodes the node sequence
853 2 mingarao
-->
854 2 mingarao
<xsl:function name="functx:distinct-nodes" as="node()*"
855 2 mingarao
              xmlns:functx="http://www.functx.com" >
856 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
857 2 mingarao
858 2 mingarao
  <xsl:sequence select="
859 2 mingarao
    for $seq in (1 to count($nodes))
860 2 mingarao
    return $nodes[$seq][not(functx:is-node-in-sequence(
861 2 mingarao
                                .,$nodes[position() &lt; $seq]))]
862 2 mingarao
 "/>
863 2 mingarao
864 2 mingarao
</xsl:function>
865 2 mingarao
866 2 mingarao
867 2 mingarao
<!--
868 2 mingarao
  Converts a timezone like "-05:00" or "Z" into xs:dayTimeDuration
869 2 mingarao
870 2 mingarao
 @author  Priscilla Walmsley, Datypic
871 2 mingarao
 @version 1.0
872 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_duration-from-timezone.html
873 2 mingarao
 @param   $timezone the time zone, in (+|-)HH:MM format
874 2 mingarao
-->
875 2 mingarao
<xsl:function name="functx:duration-from-timezone" as="xs:dayTimeDuration"
876 2 mingarao
              xmlns:functx="http://www.functx.com" >
877 2 mingarao
  <xsl:param name="timezone" as="xs:string"/>
878 2 mingarao
879 2 mingarao
  <xsl:sequence select="
880 2 mingarao
   xs:dayTimeDuration(
881 2 mingarao
     if (not(matches($timezone,'Z|[\+\-]\d{2}:\d{2}')))
882 2 mingarao
     then error(xs:QName('functx:Invalid_Timezone_Value'))
883 2 mingarao
     else if ($timezone = 'Z')
884 2 mingarao
     then 'PT0S'
885 2 mingarao
     else replace($timezone,'\+?(\d{2}):\d{2}','PT$1H')
886 2 mingarao
        )
887 2 mingarao
 "/>
888 2 mingarao
889 2 mingarao
</xsl:function>
890 2 mingarao
891 2 mingarao
892 2 mingarao
<!--
893 2 mingarao
  Dynamically evaluates a simple XPath path
894 2 mingarao
895 2 mingarao
 @author  Priscilla Walmsley, Datypic
896 2 mingarao
 @version 1.0
897 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_dynamic-path.html
898 2 mingarao
 @param   $parent the root to start from
899 2 mingarao
 @param   $path the path expression
900 2 mingarao
-->
901 2 mingarao
<xsl:function name="functx:dynamic-path" as="item()*"
902 2 mingarao
              xmlns:functx="http://www.functx.com" >
903 2 mingarao
  <xsl:param name="parent" as="node()"/>
904 2 mingarao
  <xsl:param name="path" as="xs:string"/>
905 2 mingarao
906 2 mingarao
  <xsl:variable name="nextStep"
907 2 mingarao
        select="functx:substring-before-if-contains($path,'/')"/>
908 2 mingarao
  <xsl:variable name="restOfSteps"
909 2 mingarao
        select="substring-after($path,'/')"/>
910 2 mingarao
  <xsl:for-each select="
911 2 mingarao
    ($parent/*[functx:name-test(name(),$nextStep)],
912 2 mingarao
     $parent/@*[functx:name-test(name(),
913 2 mingarao
                              substring-after($nextStep,'@'))])">
914 2 mingarao
    <xsl:variable name="child" select="."/>
915 2 mingarao
    <xsl:sequence select="if ($restOfSteps)
916 2 mingarao
         then functx:dynamic-path($child, $restOfSteps)
917 2 mingarao
         else $child"/>
918 2 mingarao
  </xsl:for-each>
919 2 mingarao
920 2 mingarao
</xsl:function>
921 2 mingarao
922 2 mingarao
923 2 mingarao
<!--
924 2 mingarao
  Escapes regex special characters
925 2 mingarao
926 2 mingarao
 @author  Priscilla Walmsley, Datypic
927 2 mingarao
 @version 1.0
928 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_escape-for-regex.html
929 2 mingarao
 @param   $arg the string to escape
930 2 mingarao
-->
931 2 mingarao
<xsl:function name="functx:escape-for-regex" as="xs:string"
932 2 mingarao
              xmlns:functx="http://www.functx.com" >
933 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
934 2 mingarao
935 2 mingarao
  <xsl:sequence select="
936 2 mingarao
   replace($arg,
937 2 mingarao
           '(\.|\[|\]|\\|\||\-|\^|\$|\?|\*|\+|\{|\}|\(|\))','\\$1')
938 2 mingarao
 "/>
939 2 mingarao
940 2 mingarao
</xsl:function>
941 2 mingarao
942 2 mingarao
943 2 mingarao
<!--
944 2 mingarao
  Whether one (and only one) of two boolean values is true
945 2 mingarao
946 2 mingarao
 @author  Priscilla Walmsley, Datypic
947 2 mingarao
 @version 1.0
948 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_exclusive-or.html
949 2 mingarao
 @param   $arg1 the first boolean value
950 2 mingarao
 @param   $arg2 the second boolean value
951 2 mingarao
-->
952 2 mingarao
<xsl:function name="functx:exclusive-or" as="xs:boolean?"
953 2 mingarao
              xmlns:functx="http://www.functx.com" >
954 2 mingarao
  <xsl:param name="arg1" as="xs:boolean?"/>
955 2 mingarao
  <xsl:param name="arg2" as="xs:boolean?"/>
956 2 mingarao
957 2 mingarao
  <xsl:sequence select="
958 2 mingarao
   $arg1 != $arg2
959 2 mingarao
 "/>
960 2 mingarao
961 2 mingarao
</xsl:function>
962 2 mingarao
963 2 mingarao
964 2 mingarao
<!--
965 2 mingarao
  The first day of the month of a date
966 2 mingarao
967 2 mingarao
 @author  Priscilla Walmsley, Datypic
968 2 mingarao
 @version 1.0
969 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_first-day-of-month.html
970 2 mingarao
 @param   $date the date
971 2 mingarao
-->
972 2 mingarao
<xsl:function name="functx:first-day-of-month" as="xs:date?"
973 2 mingarao
              xmlns:functx="http://www.functx.com" >
974 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
975 2 mingarao
976 2 mingarao
  <xsl:sequence select="
977 2 mingarao
   functx:date(year-from-date(xs:date($date)),
978 2 mingarao
            month-from-date(xs:date($date)),
979 2 mingarao
            1)
980 2 mingarao
 "/>
981 2 mingarao
982 2 mingarao
</xsl:function>
983 2 mingarao
984 2 mingarao
985 2 mingarao
<!--
986 2 mingarao
  The first day of the year of a date
987 2 mingarao
988 2 mingarao
 @author  Priscilla Walmsley, Datypic
989 2 mingarao
 @version 1.0
990 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_first-day-of-year.html
991 2 mingarao
 @param   $date the date
992 2 mingarao
-->
993 2 mingarao
<xsl:function name="functx:first-day-of-year" as="xs:date?"
994 2 mingarao
              xmlns:functx="http://www.functx.com" >
995 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
996 2 mingarao
997 2 mingarao
  <xsl:sequence select="
998 2 mingarao
   functx:date(year-from-date(xs:date($date)), 1, 1)
999 2 mingarao
 "/>
1000 2 mingarao
1001 2 mingarao
</xsl:function>
1002 2 mingarao
1003 2 mingarao
1004 2 mingarao
<!--
1005 2 mingarao
  The XML node in a sequence that appears first in document order
1006 2 mingarao
1007 2 mingarao
 @author  Priscilla Walmsley, Datypic
1008 2 mingarao
 @version 1.0
1009 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_first-node.html
1010 2 mingarao
 @param   $nodes the sequence of nodes
1011 2 mingarao
-->
1012 2 mingarao
<xsl:function name="functx:first-node" as="node()?"
1013 2 mingarao
              xmlns:functx="http://www.functx.com" >
1014 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
1015 2 mingarao
1016 2 mingarao
  <xsl:sequence select="
1017 2 mingarao
   ($nodes/.)[1]
1018 2 mingarao
 "/>
1019 2 mingarao
1020 2 mingarao
</xsl:function>
1021 2 mingarao
1022 2 mingarao
1023 2 mingarao
<!--
1024 2 mingarao
  Whether an XML node follows another without being its descendant
1025 2 mingarao
1026 2 mingarao
 @author  W3C XML Query Working Group
1027 2 mingarao
 @version 1.0
1028 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_follows-not-descendant.html
1029 2 mingarao
 @param   $a the first node
1030 2 mingarao
 @param   $b the second node
1031 2 mingarao
-->
1032 2 mingarao
<xsl:function name="functx:follows-not-descendant" as="xs:boolean"
1033 2 mingarao
              xmlns:functx="http://www.functx.com" >
1034 2 mingarao
  <xsl:param name="a" as="node()?"/>
1035 2 mingarao
  <xsl:param name="b" as="node()?"/>
1036 2 mingarao
1037 2 mingarao
  <xsl:sequence select="
1038 2 mingarao
   $a >> $b and empty($b intersect $a/ancestor::node())
1039 2 mingarao
 "/>
1040 2 mingarao
1041 2 mingarao
</xsl:function>
1042 2 mingarao
1043 2 mingarao
1044 2 mingarao
<!--
1045 2 mingarao
  Moves title words like "the" and "a" to the end of strings
1046 2 mingarao
1047 2 mingarao
 @author  Priscilla Walmsley, Datypic
1048 2 mingarao
 @version 1.0
1049 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_format-as-title-en.html
1050 2 mingarao
 @param   $titles the titles to format
1051 2 mingarao
-->
1052 2 mingarao
<xsl:function name="functx:format-as-title-en" as="xs:string*"
1053 2 mingarao
              xmlns:functx="http://www.functx.com" >
1054 2 mingarao
  <xsl:param name="titles" as="xs:string*"/>
1055 2 mingarao
1056 2 mingarao
   <xsl:variable name="wordsToMoveToEnd"
1057 2 mingarao
                 select="('A', 'An', 'The')"/>
1058 2 mingarao
   <xsl:for-each select="$titles">
1059 2 mingarao
     <xsl:variable name="title" select="."/>
1060 2 mingarao
     <xsl:variable name="firstWord"
1061 2 mingarao
          select="functx:substring-before-match($title,'\W')"/>
1062 2 mingarao
     <xsl:sequence select="if ($firstWord = $wordsToMoveToEnd)
1063 2 mingarao
          then replace($title,'(.*?)\W(.*)', '$2, $1')
1064 2 mingarao
          else $title"/>
1065 2 mingarao
   </xsl:for-each>
1066 2 mingarao
1067 2 mingarao
</xsl:function>
1068 2 mingarao
1069 2 mingarao
1070 2 mingarao
<!--
1071 2 mingarao
  Returns the fragment from a URI
1072 2 mingarao
1073 2 mingarao
 @author  Priscilla Walmsley, Datypic
1074 2 mingarao
 @version 1.0
1075 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_fragment-from-uri.html
1076 2 mingarao
 @param   $uri the URI
1077 2 mingarao
-->
1078 2 mingarao
<xsl:function name="functx:fragment-from-uri" as="xs:string?"
1079 2 mingarao
              xmlns:functx="http://www.functx.com" >
1080 2 mingarao
  <xsl:param name="uri" as="xs:string?"/>
1081 2 mingarao
1082 2 mingarao
  <xsl:sequence select="
1083 2 mingarao
   substring-after($uri,'#')
1084 2 mingarao
 "/>
1085 2 mingarao
1086 2 mingarao
</xsl:function>
1087 2 mingarao
1088 2 mingarao
1089 2 mingarao
<!--
1090 2 mingarao
  Whether an element has element-only content
1091 2 mingarao
1092 2 mingarao
 @author  Priscilla Walmsley, Datypic
1093 2 mingarao
 @version 1.0
1094 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_has-element-only-content.html
1095 2 mingarao
 @param   $element the XML element to test
1096 2 mingarao
-->
1097 2 mingarao
<xsl:function name="functx:has-element-only-content" as="xs:boolean"
1098 2 mingarao
              xmlns:functx="http://www.functx.com" >
1099 2 mingarao
  <xsl:param name="element" as="element()"/>
1100 2 mingarao
1101 2 mingarao
  <xsl:sequence select="
1102 2 mingarao
   not($element/text()[normalize-space(.) != '']) and $element/*
1103 2 mingarao
 "/>
1104 2 mingarao
1105 2 mingarao
</xsl:function>
1106 2 mingarao
1107 2 mingarao
1108 2 mingarao
<!--
1109 2 mingarao
  Whether an element has empty content
1110 2 mingarao
1111 2 mingarao
 @author  Priscilla Walmsley, Datypic
1112 2 mingarao
 @version 1.0
1113 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_has-empty-content.html
1114 2 mingarao
 @param   $element the XML element to test
1115 2 mingarao
-->
1116 2 mingarao
<xsl:function name="functx:has-empty-content" as="xs:boolean"
1117 2 mingarao
              xmlns:functx="http://www.functx.com" >
1118 2 mingarao
  <xsl:param name="element" as="element()"/>
1119 2 mingarao
1120 2 mingarao
  <xsl:sequence select="
1121 2 mingarao
   not($element/node())
1122 2 mingarao
 "/>
1123 2 mingarao
1124 2 mingarao
</xsl:function>
1125 2 mingarao
1126 2 mingarao
1127 2 mingarao
<!--
1128 2 mingarao
  Whether an element has mixed content
1129 2 mingarao
1130 2 mingarao
 @author  Priscilla Walmsley, Datypic
1131 2 mingarao
 @version 1.0
1132 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_has-mixed-content.html
1133 2 mingarao
 @param   $element the XML element to test
1134 2 mingarao
-->
1135 2 mingarao
<xsl:function name="functx:has-mixed-content" as="xs:boolean"
1136 2 mingarao
              xmlns:functx="http://www.functx.com" >
1137 2 mingarao
  <xsl:param name="element" as="element()"/>
1138 2 mingarao
1139 2 mingarao
  <xsl:sequence select="
1140 2 mingarao
   $element/text()[normalize-space(.) != ''] and $element/*
1141 2 mingarao
 "/>
1142 2 mingarao
1143 2 mingarao
</xsl:function>
1144 2 mingarao
1145 2 mingarao
1146 2 mingarao
<!--
1147 2 mingarao
  Whether an element has simple content
1148 2 mingarao
1149 2 mingarao
 @author  Priscilla Walmsley, Datypic
1150 2 mingarao
 @version 1.0
1151 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_has-simple-content.html
1152 2 mingarao
 @param   $element the XML element to test
1153 2 mingarao
-->
1154 2 mingarao
<xsl:function name="functx:has-simple-content" as="xs:boolean"
1155 2 mingarao
              xmlns:functx="http://www.functx.com" >
1156 2 mingarao
  <xsl:param name="element" as="element()"/>
1157 2 mingarao
1158 2 mingarao
  <xsl:sequence select="
1159 2 mingarao
   $element/text() and not($element/*)
1160 2 mingarao
 "/>
1161 2 mingarao
1162 2 mingarao
</xsl:function>
1163 2 mingarao
1164 2 mingarao
1165 2 mingarao
<!--
1166 2 mingarao
  Gets the ID of an XML element
1167 2 mingarao
1168 2 mingarao
 @author  Priscilla Walmsley, Datypic
1169 2 mingarao
 @version 1.0
1170 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_id-from-element.html
1171 2 mingarao
 @param   $element the element
1172 2 mingarao
-->
1173 2 mingarao
<xsl:function name="functx:id-from-element" as="xs:string?"
1174 2 mingarao
              xmlns:functx="http://www.functx.com" >
1175 2 mingarao
  <xsl:param name="element" as="element()?"/>
1176 2 mingarao
1177 2 mingarao
  <xsl:sequence select="
1178 2 mingarao
  data(($element/@*[id(.) is ..])[1])
1179 2 mingarao
 "/>
1180 2 mingarao
1181 2 mingarao
</xsl:function>
1182 2 mingarao
1183 2 mingarao
1184 2 mingarao
<!--
1185 2 mingarao
  Gets XML element(s) that have an attribute with a particular value
1186 2 mingarao
1187 2 mingarao
 @author  Priscilla Walmsley, Datypic
1188 2 mingarao
 @version 1.0
1189 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_id-untyped.html
1190 2 mingarao
 @param   $node the root node(s) to start from
1191 2 mingarao
 @param   $id the "id" to find
1192 2 mingarao
-->
1193 2 mingarao
<xsl:function name="functx:id-untyped" as="element()*"
1194 2 mingarao
              xmlns:functx="http://www.functx.com" >
1195 2 mingarao
  <xsl:param name="node" as="node()*"/>
1196 2 mingarao
  <xsl:param name="id" as="xs:anyAtomicType"/>
1197 2 mingarao
1198 2 mingarao
  <xsl:sequence select="
1199 2 mingarao
  $node//*[@* = $id]
1200 2 mingarao
 "/>
1201 2 mingarao
1202 2 mingarao
</xsl:function>
1203 2 mingarao
1204 2 mingarao
1205 2 mingarao
<!--
1206 2 mingarao
  The first argument if it is not empty, otherwise the second argument
1207 2 mingarao
1208 2 mingarao
 @author  W3C XML Query WG
1209 2 mingarao
 @version 1.0
1210 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_if-absent.html
1211 2 mingarao
 @param   $arg the item(s) that may be absent
1212 2 mingarao
 @param   $value the item(s) to use if the item is absent
1213 2 mingarao
-->
1214 2 mingarao
<xsl:function name="functx:if-absent" as="item()*"
1215 2 mingarao
              xmlns:functx="http://www.functx.com" >
1216 2 mingarao
  <xsl:param name="arg" as="item()*"/>
1217 2 mingarao
  <xsl:param name="value" as="item()*"/>
1218 2 mingarao
1219 2 mingarao
  <xsl:sequence select="
1220 2 mingarao
    if (exists($arg))
1221 2 mingarao
    then $arg
1222 2 mingarao
    else $value
1223 2 mingarao
 "/>
1224 2 mingarao
1225 2 mingarao
</xsl:function>
1226 2 mingarao
1227 2 mingarao
1228 2 mingarao
<!--
1229 2 mingarao
  The first argument if it is not blank, otherwise the second argument
1230 2 mingarao
1231 2 mingarao
 @author  Priscilla Walmsley, Datypic
1232 2 mingarao
 @version 1.0
1233 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_if-empty.html
1234 2 mingarao
 @param   $arg the node that may be empty
1235 2 mingarao
 @param   $value the item(s) to use if the node is empty
1236 2 mingarao
-->
1237 2 mingarao
<xsl:function name="functx:if-empty" as="item()*"
1238 2 mingarao
              xmlns:functx="http://www.functx.com" >
1239 2 mingarao
  <xsl:param name="arg" as="item()?"/>
1240 2 mingarao
  <xsl:param name="value" as="item()*"/>
1241 2 mingarao
1242 2 mingarao
  <xsl:sequence select="
1243 2 mingarao
  if (string($arg) != '')
1244 2 mingarao
  then data($arg)
1245 2 mingarao
  else $value
1246 2 mingarao
 "/>
1247 2 mingarao
1248 2 mingarao
</xsl:function>
1249 2 mingarao
1250 2 mingarao
1251 2 mingarao
<!--
1252 2 mingarao
  The position of a node in a sequence, based on contents and attributes
1253 2 mingarao
1254 2 mingarao
 @author  Priscilla Walmsley, Datypic
1255 2 mingarao
 @version 1.0
1256 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_index-of-deep-equal-node.html
1257 2 mingarao
 @param   $nodes the node sequence
1258 2 mingarao
 @param   $nodeToFind the node to find in the sequence
1259 2 mingarao
-->
1260 2 mingarao
<xsl:function name="functx:index-of-deep-equal-node" as="xs:integer*"
1261 2 mingarao
              xmlns:functx="http://www.functx.com" >
1262 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
1263 2 mingarao
  <xsl:param name="nodeToFind" as="node()"/>
1264 2 mingarao
1265 2 mingarao
  <xsl:sequence select="
1266 2 mingarao
  for $seq in (1 to count($nodes))
1267 2 mingarao
  return $seq[deep-equal($nodes[$seq],$nodeToFind)]
1268 2 mingarao
 "/>
1269 2 mingarao
1270 2 mingarao
</xsl:function>
1271 2 mingarao
1272 2 mingarao
1273 2 mingarao
<!--
1274 2 mingarao
  The first position of a matching substring
1275 2 mingarao
1276 2 mingarao
 @author  Priscilla Walmsley, Datypic
1277 2 mingarao
 @version 1.0
1278 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_index-of-match-first.html
1279 2 mingarao
 @param   $arg the string
1280 2 mingarao
 @param   $pattern the pattern to match
1281 2 mingarao
-->
1282 2 mingarao
<xsl:function name="functx:index-of-match-first" as="xs:integer?"
1283 2 mingarao
              xmlns:functx="http://www.functx.com" >
1284 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
1285 2 mingarao
  <xsl:param name="pattern" as="xs:string"/>
1286 2 mingarao
1287 2 mingarao
  <xsl:sequence select="
1288 2 mingarao
  if (matches($arg,$pattern))
1289 2 mingarao
  then string-length(tokenize($arg, $pattern)[1]) + 1
1290 2 mingarao
  else ()
1291 2 mingarao
 "/>
1292 2 mingarao
1293 2 mingarao
</xsl:function>
1294 2 mingarao
1295 2 mingarao
1296 2 mingarao
<!--
1297 2 mingarao
  The position of a node in a sequence, based on node identity
1298 2 mingarao
1299 2 mingarao
 @author  W3C XML Query Working Group
1300 2 mingarao
 @version 1.0
1301 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_index-of-node.html
1302 2 mingarao
 @param   $nodes the node sequence
1303 2 mingarao
 @param   $nodeToFind the node to find in the sequence
1304 2 mingarao
-->
1305 2 mingarao
<xsl:function name="functx:index-of-node" as="xs:integer*"
1306 2 mingarao
              xmlns:functx="http://www.functx.com" >
1307 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
1308 2 mingarao
  <xsl:param name="nodeToFind" as="node()"/>
1309 2 mingarao
1310 2 mingarao
  <xsl:sequence select="
1311 2 mingarao
  for $seq in (1 to count($nodes))
1312 2 mingarao
  return $seq[$nodes[$seq] is $nodeToFind]
1313 2 mingarao
 "/>
1314 2 mingarao
1315 2 mingarao
</xsl:function>
1316 2 mingarao
1317 2 mingarao
1318 2 mingarao
<!--
1319 2 mingarao
  The first position of a substring
1320 2 mingarao
1321 2 mingarao
 @author  Priscilla Walmsley, Datypic
1322 2 mingarao
 @version 1.0
1323 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_index-of-string-first.html
1324 2 mingarao
 @param   $arg the string
1325 2 mingarao
 @param   $substring the substring to find
1326 2 mingarao
-->
1327 2 mingarao
<xsl:function name="functx:index-of-string-first" as="xs:integer?"
1328 2 mingarao
              xmlns:functx="http://www.functx.com" >
1329 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
1330 2 mingarao
  <xsl:param name="substring" as="xs:string"/>
1331 2 mingarao
1332 2 mingarao
  <xsl:sequence select="
1333 2 mingarao
  if (contains($arg, $substring))
1334 2 mingarao
  then string-length(substring-before($arg, $substring))+1
1335 2 mingarao
  else ()
1336 2 mingarao
 "/>
1337 2 mingarao
1338 2 mingarao
</xsl:function>
1339 2 mingarao
1340 2 mingarao
1341 2 mingarao
<!--
1342 2 mingarao
  The last position of a substring
1343 2 mingarao
1344 2 mingarao
 @author  Priscilla Walmsley, Datypic
1345 2 mingarao
 @version 1.0
1346 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_index-of-string-last.html
1347 2 mingarao
 @param   $arg the string
1348 2 mingarao
 @param   $substring the substring to find
1349 2 mingarao
-->
1350 2 mingarao
<xsl:function name="functx:index-of-string-last" as="xs:integer?"
1351 2 mingarao
              xmlns:functx="http://www.functx.com" >
1352 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
1353 2 mingarao
  <xsl:param name="substring" as="xs:string"/>
1354 2 mingarao
1355 2 mingarao
  <xsl:sequence select="
1356 2 mingarao
  functx:index-of-string($arg, $substring)[last()]
1357 2 mingarao
 "/>
1358 2 mingarao
1359 2 mingarao
</xsl:function>
1360 2 mingarao
1361 2 mingarao
1362 2 mingarao
<!--
1363 2 mingarao
  The position(s) of a substring
1364 2 mingarao
1365 2 mingarao
 @author  Priscilla Walmsley, Datypic
1366 2 mingarao
 @version 1.0
1367 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_index-of-string.html
1368 2 mingarao
 @param   $arg the string
1369 2 mingarao
 @param   $substring the substring to find
1370 2 mingarao
-->
1371 2 mingarao
<xsl:function name="functx:index-of-string" as="xs:integer*"
1372 2 mingarao
              xmlns:functx="http://www.functx.com" >
1373 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
1374 2 mingarao
  <xsl:param name="substring" as="xs:string"/>
1375 2 mingarao
1376 2 mingarao
  <xsl:sequence select="
1377 2 mingarao
  if (contains($arg, $substring))
1378 2 mingarao
  then (string-length(substring-before($arg, $substring))+1,
1379 2 mingarao
        for $other in
1380 2 mingarao
           functx:index-of-string(substring-after($arg, $substring),
1381 2 mingarao
                               $substring)
1382 2 mingarao
        return
1383 2 mingarao
          $other +
1384 2 mingarao
          string-length(substring-before($arg, $substring)) +
1385 2 mingarao
          string-length($substring))
1386 2 mingarao
  else ()
1387 2 mingarao
 "/>
1388 2 mingarao
1389 2 mingarao
</xsl:function>
1390 2 mingarao
1391 2 mingarao
1392 2 mingarao
<!--
1393 2 mingarao
  Inserts a string at a specified position
1394 2 mingarao
1395 2 mingarao
 @author  Priscilla Walmsley, Datypic
1396 2 mingarao
 @version 1.0
1397 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_insert-string.html
1398 2 mingarao
 @param   $originalString the original string to insert into
1399 2 mingarao
 @param   $stringToInsert the string to insert
1400 2 mingarao
 @param   $pos the position
1401 2 mingarao
-->
1402 2 mingarao
<xsl:function name="functx:insert-string" as="xs:string"
1403 2 mingarao
              xmlns:functx="http://www.functx.com" >
1404 2 mingarao
  <xsl:param name="originalString" as="xs:string?"/>
1405 2 mingarao
  <xsl:param name="stringToInsert" as="xs:string?"/>
1406 2 mingarao
  <xsl:param name="pos" as="xs:integer"/>
1407 2 mingarao
1408 2 mingarao
  <xsl:sequence select="
1409 2 mingarao
   concat(substring($originalString,1,$pos - 1),
1410 2 mingarao
             $stringToInsert,
1411 2 mingarao
             substring($originalString,$pos))
1412 2 mingarao
 "/>
1413 2 mingarao
1414 2 mingarao
</xsl:function>
1415 2 mingarao
1416 2 mingarao
1417 2 mingarao
<!--
1418 2 mingarao
  Whether a value is numeric
1419 2 mingarao
1420 2 mingarao
 @author  Priscilla Walmsley, Datypic
1421 2 mingarao
 @version 1.0
1422 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-a-number.html
1423 2 mingarao
 @param   $value the value to test
1424 2 mingarao
-->
1425 2 mingarao
<xsl:function name="functx:is-a-number" as="xs:boolean"
1426 2 mingarao
              xmlns:functx="http://www.functx.com" >
1427 2 mingarao
  <xsl:param name="value" as="xs:anyAtomicType?"/>
1428 2 mingarao
1429 2 mingarao
  <xsl:sequence select="
1430 2 mingarao
   string(number($value)) != 'NaN'
1431 2 mingarao
 "/>
1432 2 mingarao
1433 2 mingarao
</xsl:function>
1434 2 mingarao
1435 2 mingarao
1436 2 mingarao
<!--
1437 2 mingarao
  Whether a URI is absolute
1438 2 mingarao
1439 2 mingarao
 @author  Priscilla Walmsley, Datypic
1440 2 mingarao
 @version 1.0
1441 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-absolute-uri.html
1442 2 mingarao
 @param   $uri the URI to test
1443 2 mingarao
-->
1444 2 mingarao
<xsl:function name="functx:is-absolute-uri" as="xs:boolean"
1445 2 mingarao
              xmlns:functx="http://www.functx.com" >
1446 2 mingarao
  <xsl:param name="uri" as="xs:string?"/>
1447 2 mingarao
1448 2 mingarao
  <xsl:sequence select="
1449 2 mingarao
   matches($uri,'^[a-z]+:')
1450 2 mingarao
 "/>
1451 2 mingarao
1452 2 mingarao
</xsl:function>
1453 2 mingarao
1454 2 mingarao
1455 2 mingarao
<!--
1456 2 mingarao
  Whether an XML node is an ancestor of another node
1457 2 mingarao
1458 2 mingarao
 @author  Priscilla Walmsley, Datypic
1459 2 mingarao
 @version 1.0
1460 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-ancestor.html
1461 2 mingarao
 @param   $node1 the first node
1462 2 mingarao
 @param   $node2 the second node
1463 2 mingarao
-->
1464 2 mingarao
<xsl:function name="functx:is-ancestor" as="xs:boolean"
1465 2 mingarao
              xmlns:functx="http://www.functx.com" >
1466 2 mingarao
  <xsl:param name="node1" as="node()"/>
1467 2 mingarao
  <xsl:param name="node2" as="node()"/>
1468 2 mingarao
1469 2 mingarao
  <xsl:sequence select="
1470 2 mingarao
   exists($node1 intersect $node2/ancestor::node())
1471 2 mingarao
 "/>
1472 2 mingarao
1473 2 mingarao
</xsl:function>
1474 2 mingarao
1475 2 mingarao
1476 2 mingarao
<!--
1477 2 mingarao
  Whether an XML node is a descendant of another node
1478 2 mingarao
1479 2 mingarao
 @author  Priscilla Walmsley, Datypic
1480 2 mingarao
 @version 1.0
1481 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-descendant.html
1482 2 mingarao
 @param   $node1 the first node
1483 2 mingarao
 @param   $node2 the second node
1484 2 mingarao
-->
1485 2 mingarao
<xsl:function name="functx:is-descendant" as="xs:boolean"
1486 2 mingarao
              xmlns:functx="http://www.functx.com" >
1487 2 mingarao
  <xsl:param name="node1" as="node()"/>
1488 2 mingarao
  <xsl:param name="node2" as="node()"/>
1489 2 mingarao
1490 2 mingarao
  <xsl:sequence select="
1491 2 mingarao
   boolean($node2 intersect $node1/ancestor::node())
1492 2 mingarao
 "/>
1493 2 mingarao
1494 2 mingarao
</xsl:function>
1495 2 mingarao
1496 2 mingarao
1497 2 mingarao
<!--
1498 2 mingarao
  Whether a date falls in a leap year
1499 2 mingarao
1500 2 mingarao
 @author  Priscilla Walmsley, Datypic
1501 2 mingarao
 @version 1.0
1502 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-leap-year.html
1503 2 mingarao
 @param   $date the date or year
1504 2 mingarao
-->
1505 2 mingarao
<xsl:function name="functx:is-leap-year" as="xs:boolean"
1506 2 mingarao
              xmlns:functx="http://www.functx.com" >
1507 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
1508 2 mingarao
1509 2 mingarao
  <xsl:sequence select="
1510 2 mingarao
    for $year in xs:integer(substring(string($date),1,4))
1511 2 mingarao
    return ($year mod 4 = 0 and
1512 2 mingarao
            $year mod 100 != 0) or
1513 2 mingarao
            $year mod 400 = 0
1514 2 mingarao
 "/>
1515 2 mingarao
1516 2 mingarao
</xsl:function>
1517 2 mingarao
1518 2 mingarao
1519 2 mingarao
<!--
1520 2 mingarao
  Whether an XML node is among the descendants of a sequence, based on contents and attributes
1521 2 mingarao
1522 2 mingarao
 @author  Priscilla Walmsley, Datypic
1523 2 mingarao
 @version 1.0
1524 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-node-among-descendants-deep-equal.html
1525 2 mingarao
 @param   $node the node to test
1526 2 mingarao
 @param   $seq the sequence of nodes to search
1527 2 mingarao
-->
1528 2 mingarao
<xsl:function name="functx:is-node-among-descendants-deep-equal" as="xs:boolean"
1529 2 mingarao
              xmlns:functx="http://www.functx.com" >
1530 2 mingarao
  <xsl:param name="node" as="node()?"/>
1531 2 mingarao
  <xsl:param name="seq" as="node()*"/>
1532 2 mingarao
1533 2 mingarao
  <xsl:sequence select="
1534 2 mingarao
   some $nodeInSeq in $seq/descendant-or-self::*/(.|@*)
1535 2 mingarao
   satisfies deep-equal($nodeInSeq,$node)
1536 2 mingarao
 "/>
1537 2 mingarao
1538 2 mingarao
</xsl:function>
1539 2 mingarao
1540 2 mingarao
1541 2 mingarao
<!--
1542 2 mingarao
  Whether an XML node is among the descendants of a sequence, based on node identity
1543 2 mingarao
1544 2 mingarao
 @author  Priscilla Walmsley, Datypic
1545 2 mingarao
 @version 1.0
1546 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-node-among-descendants.html
1547 2 mingarao
 @param   $node the node to test
1548 2 mingarao
 @param   $seq the sequence of nodes to search
1549 2 mingarao
-->
1550 2 mingarao
<xsl:function name="functx:is-node-among-descendants" as="xs:boolean"
1551 2 mingarao
              xmlns:functx="http://www.functx.com" >
1552 2 mingarao
  <xsl:param name="node" as="node()?"/>
1553 2 mingarao
  <xsl:param name="seq" as="node()*"/>
1554 2 mingarao
1555 2 mingarao
  <xsl:sequence select="
1556 2 mingarao
   some $nodeInSeq in $seq/descendant-or-self::*/(.|@*)
1557 2 mingarao
   satisfies $nodeInSeq is $node
1558 2 mingarao
 "/>
1559 2 mingarao
1560 2 mingarao
</xsl:function>
1561 2 mingarao
1562 2 mingarao
1563 2 mingarao
<!--
1564 2 mingarao
  Whether an XML node is in a sequence, based on contents and attributes
1565 2 mingarao
1566 2 mingarao
 @author  Priscilla Walmsley, Datypic
1567 2 mingarao
 @version 1.0
1568 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-node-in-sequence-deep-equal.html
1569 2 mingarao
 @param   $node the node to test
1570 2 mingarao
 @param   $seq the sequence of nodes to search
1571 2 mingarao
-->
1572 2 mingarao
<xsl:function name="functx:is-node-in-sequence-deep-equal" as="xs:boolean"
1573 2 mingarao
              xmlns:functx="http://www.functx.com" >
1574 2 mingarao
  <xsl:param name="node" as="node()?"/>
1575 2 mingarao
  <xsl:param name="seq" as="node()*"/>
1576 2 mingarao
1577 2 mingarao
  <xsl:sequence select="
1578 2 mingarao
   some $nodeInSeq in $seq satisfies deep-equal($nodeInSeq,$node)
1579 2 mingarao
 "/>
1580 2 mingarao
1581 2 mingarao
</xsl:function>
1582 2 mingarao
1583 2 mingarao
1584 2 mingarao
<!--
1585 2 mingarao
  Whether an XML node is in a sequence, based on node identity
1586 2 mingarao
1587 2 mingarao
 @author  Priscilla Walmsley, Datypic
1588 2 mingarao
 @version 1.0
1589 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-node-in-sequence.html
1590 2 mingarao
 @param   $node the node to test
1591 2 mingarao
 @param   $seq the sequence of nodes to search
1592 2 mingarao
-->
1593 2 mingarao
<xsl:function name="functx:is-node-in-sequence" as="xs:boolean"
1594 2 mingarao
              xmlns:functx="http://www.functx.com" >
1595 2 mingarao
  <xsl:param name="node" as="node()?"/>
1596 2 mingarao
  <xsl:param name="seq" as="node()*"/>
1597 2 mingarao
1598 2 mingarao
  <xsl:sequence select="
1599 2 mingarao
   some $nodeInSeq in $seq satisfies $nodeInSeq is $node
1600 2 mingarao
 "/>
1601 2 mingarao
1602 2 mingarao
</xsl:function>
1603 2 mingarao
1604 2 mingarao
1605 2 mingarao
<!--
1606 2 mingarao
  Whether an atomic value appears in a sequence
1607 2 mingarao
1608 2 mingarao
 @author  Priscilla Walmsley, Datypic
1609 2 mingarao
 @version 1.0
1610 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_is-value-in-sequence.html
1611 2 mingarao
 @param   $value the atomic value to test
1612 2 mingarao
 @param   $seq the sequence of values to search
1613 2 mingarao
-->
1614 2 mingarao
<xsl:function name="functx:is-value-in-sequence" as="xs:boolean"
1615 2 mingarao
              xmlns:functx="http://www.functx.com" >
1616 2 mingarao
  <xsl:param name="value" as="xs:anyAtomicType?"/>
1617 2 mingarao
  <xsl:param name="seq" as="xs:anyAtomicType*"/>
1618 2 mingarao
1619 2 mingarao
  <xsl:sequence select="
1620 2 mingarao
   $value = $seq
1621 2 mingarao
 "/>
1622 2 mingarao
1623 2 mingarao
</xsl:function>
1624 2 mingarao
1625 2 mingarao
1626 2 mingarao
<!--
1627 2 mingarao
  The last day of the month of a date
1628 2 mingarao
1629 2 mingarao
 @author  Priscilla Walmsley, Datypic
1630 2 mingarao
 @version 1.0
1631 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_last-day-of-month.html
1632 2 mingarao
 @param   $date the date
1633 2 mingarao
-->
1634 2 mingarao
<xsl:function name="functx:last-day-of-month" as="xs:date?"
1635 2 mingarao
              xmlns:functx="http://www.functx.com" >
1636 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
1637 2 mingarao
1638 2 mingarao
  <xsl:sequence select="
1639 2 mingarao
   functx:date(year-from-date(xs:date($date)),
1640 2 mingarao
            month-from-date(xs:date($date)),
1641 2 mingarao
            functx:days-in-month($date))
1642 2 mingarao
 "/>
1643 2 mingarao
1644 2 mingarao
</xsl:function>
1645 2 mingarao
1646 2 mingarao
1647 2 mingarao
<!--
1648 2 mingarao
  The last day of the month of a date
1649 2 mingarao
1650 2 mingarao
 @author  Priscilla Walmsley, Datypic
1651 2 mingarao
 @version 1.0
1652 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_last-day-of-year.html
1653 2 mingarao
 @param   $date the date
1654 2 mingarao
-->
1655 2 mingarao
<xsl:function name="functx:last-day-of-year" as="xs:date?"
1656 2 mingarao
              xmlns:functx="http://www.functx.com" >
1657 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
1658 2 mingarao
1659 2 mingarao
  <xsl:sequence select="
1660 2 mingarao
   functx:date(year-from-date(xs:date($date)), 12, 31)
1661 2 mingarao
 "/>
1662 2 mingarao
1663 2 mingarao
</xsl:function>
1664 2 mingarao
1665 2 mingarao
1666 2 mingarao
<!--
1667 2 mingarao
  The XML node in a sequence that is last in document order
1668 2 mingarao
1669 2 mingarao
 @author  Priscilla Walmsley, Datypic
1670 2 mingarao
 @version 1.0
1671 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_last-node.html
1672 2 mingarao
 @param   $nodes the sequence of nodes
1673 2 mingarao
-->
1674 2 mingarao
<xsl:function name="functx:last-node" as="node()?"
1675 2 mingarao
              xmlns:functx="http://www.functx.com" >
1676 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
1677 2 mingarao
1678 2 mingarao
  <xsl:sequence select="
1679 2 mingarao
   ($nodes/.)[last()]
1680 2 mingarao
 "/>
1681 2 mingarao
1682 2 mingarao
</xsl:function>
1683 2 mingarao
1684 2 mingarao
1685 2 mingarao
<!--
1686 2 mingarao
  All XML elements that don't have any child elements
1687 2 mingarao
1688 2 mingarao
 @author  Priscilla Walmsley, Datypic
1689 2 mingarao
 @version 1.0
1690 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_leaf-elements.html
1691 2 mingarao
 @param   $root the root
1692 2 mingarao
-->
1693 2 mingarao
<xsl:function name="functx:leaf-elements" as="element()*"
1694 2 mingarao
              xmlns:functx="http://www.functx.com" >
1695 2 mingarao
  <xsl:param name="root" as="node()?"/>
1696 2 mingarao
1697 2 mingarao
  <xsl:sequence select="
1698 2 mingarao
   $root/descendant-or-self::*[not(*)]
1699 2 mingarao
 "/>
1700 2 mingarao
1701 2 mingarao
</xsl:function>
1702 2 mingarao
1703 2 mingarao
1704 2 mingarao
<!--
1705 2 mingarao
  Trims leading whitespace
1706 2 mingarao
1707 2 mingarao
 @author  Priscilla Walmsley, Datypic
1708 2 mingarao
 @version 1.0
1709 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_left-trim.html
1710 2 mingarao
 @param   $arg the string to trim
1711 2 mingarao
-->
1712 2 mingarao
<xsl:function name="functx:left-trim" as="xs:string"
1713 2 mingarao
              xmlns:functx="http://www.functx.com" >
1714 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
1715 2 mingarao
1716 2 mingarao
  <xsl:sequence select="
1717 2 mingarao
   replace($arg,'^\s+','')
1718 2 mingarao
 "/>
1719 2 mingarao
1720 2 mingarao
</xsl:function>
1721 2 mingarao
1722 2 mingarao
1723 2 mingarao
<!--
1724 2 mingarao
  The number of lines
1725 2 mingarao
1726 2 mingarao
 @author  Priscilla Walmsley, Datypic
1727 2 mingarao
 @version 1.0
1728 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_line-count.html
1729 2 mingarao
 @param   $arg the string to test
1730 2 mingarao
-->
1731 2 mingarao
<xsl:function name="functx:line-count" as="xs:integer"
1732 2 mingarao
              xmlns:functx="http://www.functx.com" >
1733 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
1734 2 mingarao
1735 2 mingarao
  <xsl:sequence select="
1736 2 mingarao
   count(functx:lines($arg))
1737 2 mingarao
 "/>
1738 2 mingarao
1739 2 mingarao
</xsl:function>
1740 2 mingarao
1741 2 mingarao
1742 2 mingarao
<!--
1743 2 mingarao
  Split a string into separate lines
1744 2 mingarao
1745 2 mingarao
 @author  Priscilla Walmsley, Datypic
1746 2 mingarao
 @version 1.0
1747 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_lines.html
1748 2 mingarao
 @param   $arg the string to split
1749 2 mingarao
-->
1750 2 mingarao
<xsl:function name="functx:lines" as="xs:string*"
1751 2 mingarao
              xmlns:functx="http://www.functx.com" >
1752 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
1753 2 mingarao
1754 2 mingarao
  <xsl:sequence select="
1755 2 mingarao
   tokenize($arg, '(\r\n?|\n\r?)')
1756 2 mingarao
 "/>
1757 2 mingarao
1758 2 mingarao
</xsl:function>
1759 2 mingarao
1760 2 mingarao
1761 2 mingarao
<!--
1762 2 mingarao
  The maximum depth of elements in an XML tree
1763 2 mingarao
1764 2 mingarao
 @author  Priscilla Walmsley, Datypic
1765 2 mingarao
 @version 1.0
1766 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_max-depth.html
1767 2 mingarao
 @param   $root the root to start from
1768 2 mingarao
-->
1769 2 mingarao
<xsl:function name="functx:max-depth" as="xs:integer?"
1770 2 mingarao
              xmlns:functx="http://www.functx.com" >
1771 2 mingarao
  <xsl:param name="root" as="node()?"/>
1772 2 mingarao
1773 2 mingarao
  <xsl:sequence select="
1774 2 mingarao
   if ($root/*)
1775 2 mingarao
   then max($root/*/functx:max-depth(.)) + 1
1776 2 mingarao
   else 1
1777 2 mingarao
 "/>
1778 2 mingarao
1779 2 mingarao
</xsl:function>
1780 2 mingarao
1781 2 mingarao
1782 2 mingarao
<!--
1783 2 mingarao
  The maximum value in a sequence, figuring out its type (numeric or string)
1784 2 mingarao
1785 2 mingarao
 @author  Priscilla Walmsley, Datypic
1786 2 mingarao
 @version 1.0
1787 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_max-determine-type.html
1788 2 mingarao
 @param   $seq the sequence of values to test
1789 2 mingarao
-->
1790 2 mingarao
<xsl:function name="functx:max-determine-type" as="xs:anyAtomicType?"
1791 2 mingarao
              xmlns:functx="http://www.functx.com" >
1792 2 mingarao
  <xsl:param name="seq" as="xs:anyAtomicType*"/>
1793 2 mingarao
1794 2 mingarao
  <xsl:sequence select="
1795 2 mingarao
   if (every $value in $seq satisfies ($value castable as xs:double))
1796 2 mingarao
   then max(for $value in $seq return xs:double($value))
1797 2 mingarao
   else max(for $value in $seq return xs:string($value))
1798 2 mingarao
 "/>
1799 2 mingarao
1800 2 mingarao
</xsl:function>
1801 2 mingarao
1802 2 mingarao
1803 2 mingarao
<!--
1804 2 mingarao
  The maximum line length
1805 2 mingarao
1806 2 mingarao
 @author  Priscilla Walmsley, Datypic
1807 2 mingarao
 @version 1.0
1808 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_max-line-length.html
1809 2 mingarao
 @param   $arg the string to test
1810 2 mingarao
-->
1811 2 mingarao
<xsl:function name="functx:max-line-length" as="xs:integer"
1812 2 mingarao
              xmlns:functx="http://www.functx.com" >
1813 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
1814 2 mingarao
1815 2 mingarao
  <xsl:sequence select="
1816 2 mingarao
   max(
1817 2 mingarao
     for $line in functx:lines($arg)
1818 2 mingarao
     return string-length($line))
1819 2 mingarao
 "/>
1820 2 mingarao
1821 2 mingarao
</xsl:function>
1822 2 mingarao
1823 2 mingarao
1824 2 mingarao
<!--
1825 2 mingarao
  The XML node whose typed value is the maximum
1826 2 mingarao
1827 2 mingarao
 @author  Priscilla Walmsley, Datypic
1828 2 mingarao
 @version 1.0
1829 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_max-node.html
1830 2 mingarao
 @param   $nodes the sequence of nodes to test
1831 2 mingarao
-->
1832 2 mingarao
<xsl:function name="functx:max-node" as="node()*"
1833 2 mingarao
              xmlns:functx="http://www.functx.com" >
1834 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
1835 2 mingarao
1836 2 mingarao
  <xsl:sequence select="
1837 2 mingarao
   $nodes[. = max($nodes)]
1838 2 mingarao
 "/>
1839 2 mingarao
1840 2 mingarao
</xsl:function>
1841 2 mingarao
1842 2 mingarao
1843 2 mingarao
<!--
1844 2 mingarao
  The maximum of a sequence of values, treating them like strings
1845 2 mingarao
1846 2 mingarao
 @author  Priscilla Walmsley, Datypic
1847 2 mingarao
 @version 1.0
1848 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_max-string.html
1849 2 mingarao
 @param   $strings the sequence of values
1850 2 mingarao
-->
1851 2 mingarao
<xsl:function name="functx:max-string" as="xs:string?"
1852 2 mingarao
              xmlns:functx="http://www.functx.com" >
1853 2 mingarao
  <xsl:param name="strings" as="xs:anyAtomicType*"/>
1854 2 mingarao
1855 2 mingarao
  <xsl:sequence select="
1856 2 mingarao
   max(for $string in $strings return string($string))
1857 2 mingarao
 "/>
1858 2 mingarao
1859 2 mingarao
</xsl:function>
1860 2 mingarao
1861 2 mingarao
1862 2 mingarao
<!--
1863 2 mingarao
  The minimum value in a sequence, figuring out its type (numeric or string)
1864 2 mingarao
1865 2 mingarao
 @author  Priscilla Walmsley, Datypic
1866 2 mingarao
 @version 1.0
1867 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_min-determine-type.html
1868 2 mingarao
 @param   $seq the sequence of values to test
1869 2 mingarao
-->
1870 2 mingarao
<xsl:function name="functx:min-determine-type" as="xs:anyAtomicType?"
1871 2 mingarao
              xmlns:functx="http://www.functx.com" >
1872 2 mingarao
  <xsl:param name="seq" as="xs:anyAtomicType*"/>
1873 2 mingarao
1874 2 mingarao
  <xsl:sequence select="
1875 2 mingarao
   if (every $value in $seq satisfies ($value castable as xs:double))
1876 2 mingarao
   then min(for $value in $seq return xs:double($value))
1877 2 mingarao
   else min(for $value in $seq return xs:string($value))
1878 2 mingarao
 "/>
1879 2 mingarao
1880 2 mingarao
</xsl:function>
1881 2 mingarao
1882 2 mingarao
1883 2 mingarao
<!--
1884 2 mingarao
  The XML node whose typed value is the minimum
1885 2 mingarao
1886 2 mingarao
 @author  Priscilla Walmsley, Datypic
1887 2 mingarao
 @version 1.0
1888 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_min-node.html
1889 2 mingarao
 @param   $nodes the sequence of nodes to test
1890 2 mingarao
-->
1891 2 mingarao
<xsl:function name="functx:min-node" as="node()*"
1892 2 mingarao
              xmlns:functx="http://www.functx.com" >
1893 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
1894 2 mingarao
1895 2 mingarao
  <xsl:sequence select="
1896 2 mingarao
   $nodes[. = min($nodes)]
1897 2 mingarao
 "/>
1898 2 mingarao
1899 2 mingarao
</xsl:function>
1900 2 mingarao
1901 2 mingarao
1902 2 mingarao
<!--
1903 2 mingarao
  The minimum of a sequence of strings, ignoring "empty" values
1904 2 mingarao
1905 2 mingarao
 @author  Priscilla Walmsley, Datypic
1906 2 mingarao
 @version 1.0
1907 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_min-non-empty-string.html
1908 2 mingarao
 @param   $strings the sequence of strings to search
1909 2 mingarao
-->
1910 2 mingarao
<xsl:function name="functx:min-non-empty-string" as="xs:string?"
1911 2 mingarao
              xmlns:functx="http://www.functx.com" >
1912 2 mingarao
  <xsl:param name="strings" as="xs:string*"/>
1913 2 mingarao
1914 2 mingarao
  <xsl:sequence select="
1915 2 mingarao
   min($strings[. != ''])
1916 2 mingarao
 "/>
1917 2 mingarao
1918 2 mingarao
</xsl:function>
1919 2 mingarao
1920 2 mingarao
1921 2 mingarao
<!--
1922 2 mingarao
  The minimum of a sequence of values, treating them like strings
1923 2 mingarao
1924 2 mingarao
 @author  Priscilla Walmsley, Datypic
1925 2 mingarao
 @version 1.0
1926 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_min-string.html
1927 2 mingarao
 @param   $strings the sequence of strings
1928 2 mingarao
-->
1929 2 mingarao
<xsl:function name="functx:min-string" as="xs:string?"
1930 2 mingarao
              xmlns:functx="http://www.functx.com" >
1931 2 mingarao
  <xsl:param name="strings" as="xs:anyAtomicType*"/>
1932 2 mingarao
1933 2 mingarao
  <xsl:sequence select="
1934 2 mingarao
   min(for $string in $strings return string($string))
1935 2 mingarao
 "/>
1936 2 mingarao
1937 2 mingarao
</xsl:function>
1938 2 mingarao
1939 2 mingarao
1940 2 mingarao
<!--
1941 2 mingarao
  Converts a string with format MMDDYYYY (with any delimiters) to a date
1942 2 mingarao
1943 2 mingarao
 @author  Priscilla Walmsley, Datypic
1944 2 mingarao
 @version 1.0
1945 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_mmddyyyy-to-date.html
1946 2 mingarao
 @param   $dateString the MMDDYYYY string
1947 2 mingarao
-->
1948 2 mingarao
<xsl:function name="functx:mmddyyyy-to-date" as="xs:date?"
1949 2 mingarao
              xmlns:functx="http://www.functx.com" >
1950 2 mingarao
  <xsl:param name="dateString" as="xs:string?"/>
1951 2 mingarao
1952 2 mingarao
  <xsl:sequence select="
1953 2 mingarao
   if (empty($dateString))
1954 2 mingarao
   then ()
1955 2 mingarao
   else if (not(matches($dateString,
1956 2 mingarao
                        '^\D*(\d{2})\D*(\d{2})\D*(\d{4})\D*$')))
1957 2 mingarao
   then error(xs:QName('functx:Invalid_Date_Format'))
1958 2 mingarao
   else xs:date(replace($dateString,
1959 2 mingarao
                        '^\D*(\d{2})\D*(\d{2})\D*(\d{4})\D*$',
1960 2 mingarao
                        '$3-$1-$2'))
1961 2 mingarao
 "/>
1962 2 mingarao
1963 2 mingarao
</xsl:function>
1964 2 mingarao
1965 2 mingarao
1966 2 mingarao
<!--
1967 2 mingarao
  The month of a date as an abbreviated word (Jan, Feb, etc.)
1968 2 mingarao
1969 2 mingarao
 @author  Priscilla Walmsley, Datypic
1970 2 mingarao
 @version 1.0
1971 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_month-abbrev-en.html
1972 2 mingarao
 @param   $date the date
1973 2 mingarao
-->
1974 2 mingarao
<xsl:function name="functx:month-abbrev-en" as="xs:string?"
1975 2 mingarao
              xmlns:functx="http://www.functx.com" >
1976 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
1977 2 mingarao
1978 2 mingarao
  <xsl:sequence select="
1979 2 mingarao
   ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
1980 2 mingarao
    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
1981 2 mingarao
    [month-from-date(xs:date($date))]
1982 2 mingarao
 "/>
1983 2 mingarao
1984 2 mingarao
</xsl:function>
1985 2 mingarao
1986 2 mingarao
1987 2 mingarao
<!--
1988 2 mingarao
  The month of a date as a word (January, February, etc.)
1989 2 mingarao
1990 2 mingarao
 @author  Priscilla Walmsley, Datypic
1991 2 mingarao
 @version 1.0
1992 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_month-name-en.html
1993 2 mingarao
 @param   $date the date
1994 2 mingarao
-->
1995 2 mingarao
<xsl:function name="functx:month-name-en" as="xs:string?"
1996 2 mingarao
              xmlns:functx="http://www.functx.com" >
1997 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
1998 2 mingarao
1999 2 mingarao
  <xsl:sequence select="
2000 2 mingarao
   ('January', 'February', 'March', 'April', 'May', 'June',
2001 2 mingarao
    'July', 'August', 'September', 'October', 'November', 'December')
2002 2 mingarao
   [month-from-date(xs:date($date))]
2003 2 mingarao
 "/>
2004 2 mingarao
2005 2 mingarao
</xsl:function>
2006 2 mingarao
2007 2 mingarao
2008 2 mingarao
<!--
2009 2 mingarao
  Whether a name matches a list of names or name wildcards
2010 2 mingarao
2011 2 mingarao
 @author  Priscilla Walmsley, Datypic
2012 2 mingarao
 @version 1.0
2013 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_name-test.html
2014 2 mingarao
 @param   $testname the name to test
2015 2 mingarao
 @param   $names the list of names or name wildcards
2016 2 mingarao
-->
2017 2 mingarao
<xsl:function name="functx:name-test" as="xs:boolean"
2018 2 mingarao
              xmlns:functx="http://www.functx.com" >
2019 2 mingarao
  <xsl:param name="testname" as="xs:string?"/>
2020 2 mingarao
  <xsl:param name="names" as="xs:string*"/>
2021 2 mingarao
2022 2 mingarao
  <xsl:sequence select="
2023 2 mingarao
$testname = $names
2024 2 mingarao
or
2025 2 mingarao
$names = '*'
2026 2 mingarao
or
2027 2 mingarao
functx:substring-after-if-contains($testname,':') =
2028 2 mingarao
   (for $name in $names
2029 2 mingarao
   return substring-after($name,'*:'))
2030 2 mingarao
or
2031 2 mingarao
substring-before($testname,':') =
2032 2 mingarao
   (for $name in $names[contains(.,':*')]
2033 2 mingarao
   return substring-before($name,':*'))
2034 2 mingarao
 "/>
2035 2 mingarao
2036 2 mingarao
</xsl:function>
2037 2 mingarao
2038 2 mingarao
2039 2 mingarao
<!--
2040 2 mingarao
  A list of namespaces used in element/attribute names in an XML fragment
2041 2 mingarao
2042 2 mingarao
 @author  Priscilla Walmsley, Datypic
2043 2 mingarao
 @version 1.0
2044 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_namespaces-in-use.html
2045 2 mingarao
 @param   $root the root node to start from
2046 2 mingarao
-->
2047 2 mingarao
<xsl:function name="functx:namespaces-in-use" as="xs:anyURI*"
2048 2 mingarao
              xmlns:functx="http://www.functx.com" >
2049 2 mingarao
  <xsl:param name="root" as="node()?"/>
2050 2 mingarao
2051 2 mingarao
  <xsl:sequence select="
2052 2 mingarao
   distinct-values(
2053 2 mingarao
      $root/descendant-or-self::*/(.|@*)/namespace-uri(.))
2054 2 mingarao
 "/>
2055 2 mingarao
2056 2 mingarao
</xsl:function>
2057 2 mingarao
2058 2 mingarao
2059 2 mingarao
<!--
2060 2 mingarao
  The next day
2061 2 mingarao
2062 2 mingarao
 @author  Priscilla Walmsley, Datypic
2063 2 mingarao
 @version 1.0
2064 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_next-day.html
2065 2 mingarao
 @param   $date the date
2066 2 mingarao
-->
2067 2 mingarao
<xsl:function name="functx:next-day" as="xs:date?"
2068 2 mingarao
              xmlns:functx="http://www.functx.com" >
2069 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
2070 2 mingarao
2071 2 mingarao
  <xsl:sequence select="
2072 2 mingarao
   xs:date($date) + xs:dayTimeDuration('P1D')
2073 2 mingarao
 "/>
2074 2 mingarao
2075 2 mingarao
</xsl:function>
2076 2 mingarao
2077 2 mingarao
2078 2 mingarao
<!--
2079 2 mingarao
  The XML node kind (element, attribute, text, etc.)
2080 2 mingarao
2081 2 mingarao
 @author  Priscilla Walmsley, Datypic
2082 2 mingarao
 @version 1.0
2083 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_node-kind.html
2084 2 mingarao
 @param   $nodes the node(s) whose kind you want to determine
2085 2 mingarao
-->
2086 2 mingarao
<xsl:function name="functx:node-kind" as="xs:string*"
2087 2 mingarao
              xmlns:functx="http://www.functx.com" >
2088 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
2089 2 mingarao
2090 2 mingarao
  <xsl:sequence select="
2091 2 mingarao
 for $node in $nodes
2092 2 mingarao
 return
2093 2 mingarao
 if ($node instance of element()) then 'element'
2094 2 mingarao
 else if ($node instance of attribute()) then 'attribute'
2095 2 mingarao
 else if ($node instance of text()) then 'text'
2096 2 mingarao
 else if ($node instance of document-node()) then 'document-node'
2097 2 mingarao
 else if ($node instance of comment()) then 'comment'
2098 2 mingarao
 else if ($node instance of processing-instruction())
2099 2 mingarao
         then 'processing-instruction'
2100 2 mingarao
 else 'unknown'
2101 2 mingarao
 "/>
2102 2 mingarao
2103 2 mingarao
</xsl:function>
2104 2 mingarao
2105 2 mingarao
2106 2 mingarao
<!--
2107 2 mingarao
  Returns any values that appear more than once in a sequence
2108 2 mingarao
2109 2 mingarao
 @author  Priscilla Walmsley, Datypic
2110 2 mingarao
 @version 1.0
2111 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_non-distinct-values.html
2112 2 mingarao
 @param   $seq the sequence of values
2113 2 mingarao
-->
2114 2 mingarao
<xsl:function name="functx:non-distinct-values" as="xs:anyAtomicType*"
2115 2 mingarao
              xmlns:functx="http://www.functx.com" >
2116 2 mingarao
  <xsl:param name="seq" as="xs:anyAtomicType*"/>
2117 2 mingarao
2118 2 mingarao
  <xsl:sequence select="
2119 2 mingarao
   for $val in distinct-values($seq)
2120 2 mingarao
   return $val[count($seq[. = $val]) > 1]
2121 2 mingarao
 "/>
2122 2 mingarao
2123 2 mingarao
</xsl:function>
2124 2 mingarao
2125 2 mingarao
2126 2 mingarao
<!--
2127 2 mingarao
  The number of regions that match a pattern
2128 2 mingarao
2129 2 mingarao
 @author  Priscilla Walmsley, Datypic
2130 2 mingarao
 @version 1.0
2131 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_number-of-matches.html
2132 2 mingarao
 @param   $arg the string to test
2133 2 mingarao
 @param   $pattern the regular expression
2134 2 mingarao
-->
2135 2 mingarao
<xsl:function name="functx:number-of-matches" as="xs:integer"
2136 2 mingarao
              xmlns:functx="http://www.functx.com" >
2137 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2138 2 mingarao
  <xsl:param name="pattern" as="xs:string"/>
2139 2 mingarao
2140 2 mingarao
  <xsl:sequence select="
2141 2 mingarao
   count(tokenize($arg,$pattern)) - 1
2142 2 mingarao
 "/>
2143 2 mingarao
2144 2 mingarao
</xsl:function>
2145 2 mingarao
2146 2 mingarao
2147 2 mingarao
<!--
2148 2 mingarao
  Resolves a relative URI and references it, returning an XML document
2149 2 mingarao
2150 2 mingarao
 @author  Priscilla Walmsley, Datypic
2151 2 mingarao
 @version 1.0
2152 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_open-ref-document.html
2153 2 mingarao
 @param   $refNode a node whose value is a relative URI reference
2154 2 mingarao
-->
2155 2 mingarao
<xsl:function name="functx:open-ref-document" as="document-node()"
2156 2 mingarao
              xmlns:functx="http://www.functx.com" >
2157 2 mingarao
  <xsl:param name="refNode" as="node()"/>
2158 2 mingarao
2159 2 mingarao
  <xsl:sequence select="
2160 2 mingarao
   if (base-uri($refNode))
2161 2 mingarao
   then doc(resolve-uri($refNode, base-uri($refNode)))
2162 2 mingarao
   else doc(resolve-uri($refNode))
2163 2 mingarao
 "/>
2164 2 mingarao
2165 2 mingarao
</xsl:function>
2166 2 mingarao
2167 2 mingarao
2168 2 mingarao
<!--
2169 2 mingarao
  Reformats a number as an ordinal number, e.g. 1st, 2nd, 3rd.
2170 2 mingarao
2171 2 mingarao
 @author  Priscilla Walmsley, Datypic
2172 2 mingarao
 @version 1.0
2173 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_ordinal-number-en.html
2174 2 mingarao
 @param   $num the number
2175 2 mingarao
-->
2176 2 mingarao
<xsl:function name="functx:ordinal-number-en" as="xs:string"
2177 2 mingarao
              xmlns:functx="http://www.functx.com" >
2178 2 mingarao
  <xsl:param name="num" as="xs:integer?"/>
2179 2 mingarao
2180 2 mingarao
  <xsl:sequence select="
2181 2 mingarao
   concat(xs:string($num),
2182 2 mingarao
         if (matches(xs:string($num),'[04-9]$|1[1-3]$')) then 'th'
2183 2 mingarao
         else if (ends-with(xs:string($num),'1')) then 'st'
2184 2 mingarao
         else if (ends-with(xs:string($num),'2')) then 'nd'
2185 2 mingarao
         else if (ends-with(xs:string($num),'3')) then 'rd'
2186 2 mingarao
         else '')
2187 2 mingarao
 "/>
2188 2 mingarao
2189 2 mingarao
</xsl:function>
2190 2 mingarao
2191 2 mingarao
2192 2 mingarao
<!--
2193 2 mingarao
  Pads an integer to a desired length by adding leading zeros
2194 2 mingarao
2195 2 mingarao
 @author  Priscilla Walmsley, Datypic
2196 2 mingarao
 @version 1.0
2197 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_pad-integer-to-length.html
2198 2 mingarao
 @param   $integerToPad the integer to pad
2199 2 mingarao
 @param   $length the desired length
2200 2 mingarao
-->
2201 2 mingarao
<xsl:function name="functx:pad-integer-to-length" as="xs:string"
2202 2 mingarao
              xmlns:functx="http://www.functx.com" >
2203 2 mingarao
  <xsl:param name="integerToPad" as="xs:anyAtomicType?"/>
2204 2 mingarao
  <xsl:param name="length" as="xs:integer"/>
2205 2 mingarao
2206 2 mingarao
  <xsl:sequence select="
2207 2 mingarao
   if ($length &lt; string-length(string($integerToPad)))
2208 2 mingarao
   then error(xs:QName('functx:Integer_Longer_Than_Length'))
2209 2 mingarao
   else concat
2210 2 mingarao
         (functx:repeat-string(
2211 2 mingarao
            '0',$length - string-length(string($integerToPad))),
2212 2 mingarao
          string($integerToPad))
2213 2 mingarao
 "/>
2214 2 mingarao
2215 2 mingarao
</xsl:function>
2216 2 mingarao
2217 2 mingarao
2218 2 mingarao
<!--
2219 2 mingarao
  Pads a string to a desired length
2220 2 mingarao
2221 2 mingarao
 @author  Priscilla Walmsley, Datypic
2222 2 mingarao
 @version 1.0
2223 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_pad-string-to-length.html
2224 2 mingarao
 @param   $stringToPad the string to pad
2225 2 mingarao
 @param   $padChar the character(s) to use as padding
2226 2 mingarao
 @param   $length the desired length
2227 2 mingarao
-->
2228 2 mingarao
<xsl:function name="functx:pad-string-to-length" as="xs:string"
2229 2 mingarao
              xmlns:functx="http://www.functx.com" >
2230 2 mingarao
  <xsl:param name="stringToPad" as="xs:string?"/>
2231 2 mingarao
  <xsl:param name="padChar" as="xs:string"/>
2232 2 mingarao
  <xsl:param name="length" as="xs:integer"/>
2233 2 mingarao
2234 2 mingarao
  <xsl:sequence select="
2235 2 mingarao
   substring(
2236 2 mingarao
     string-join (
2237 2 mingarao
       ($stringToPad, for $i in (1 to $length) return $padChar)
2238 2 mingarao
       ,'')
2239 2 mingarao
    ,1,$length)
2240 2 mingarao
 "/>
2241 2 mingarao
2242 2 mingarao
</xsl:function>
2243 2 mingarao
2244 2 mingarao
2245 2 mingarao
<!--
2246 2 mingarao
  A unique path to an XML node (or sequence of nodes)
2247 2 mingarao
2248 2 mingarao
 @author  Priscilla Walmsley, Datypic
2249 2 mingarao
 @version 1.0
2250 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_path-to-node-with-pos.html
2251 2 mingarao
 @param   $node the node sequence
2252 2 mingarao
-->
2253 2 mingarao
<xsl:function name="functx:path-to-node-with-pos" as="xs:string"
2254 2 mingarao
              xmlns:functx="http://www.functx.com" >
2255 2 mingarao
  <xsl:param name="node" as="node()?"/>
2256 2 mingarao
2257 2 mingarao
 <xsl:variable name="names" as="xs:string*">
2258 2 mingarao
   <xsl:for-each select="$node/ancestor-or-self::*">
2259 2 mingarao
     <xsl:variable name="ancestor" select="."/>
2260 2 mingarao
     <xsl:variable name="sibsOfSameName"
2261 2 mingarao
           select="$ancestor/../*[name() = name($ancestor)]"/>
2262 2 mingarao
     <xsl:sequence select="concat(name($ancestor),
2263 2 mingarao
         if (count($sibsOfSameName) &lt;= 1)
2264 2 mingarao
         then ''
2265 2 mingarao
         else concat(
2266 2 mingarao
        '[',functx:index-of-node($sibsOfSameName,$ancestor),']'))"/>
2267 2 mingarao
   </xsl:for-each>
2268 2 mingarao
 </xsl:variable>
2269 2 mingarao
 <xsl:sequence select="string-join($names,'/')"/>
2270 2 mingarao
2271 2 mingarao
</xsl:function>
2272 2 mingarao
2273 2 mingarao
2274 2 mingarao
<!--
2275 2 mingarao
  A path to an XML node (or sequence of nodes)
2276 2 mingarao
2277 2 mingarao
 @author  Priscilla Walmsley, Datypic
2278 2 mingarao
 @version 1.0
2279 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_path-to-node.html
2280 2 mingarao
 @param   $nodes the node sequence
2281 2 mingarao
-->
2282 2 mingarao
<xsl:function name="functx:path-to-node" as="xs:string*"
2283 2 mingarao
              xmlns:functx="http://www.functx.com" >
2284 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
2285 2 mingarao
2286 2 mingarao
  <xsl:sequence select="
2287 2 mingarao
$nodes/string-join(ancestor-or-self::*/name(.), '/')
2288 2 mingarao
 "/>
2289 2 mingarao
2290 2 mingarao
</xsl:function>
2291 2 mingarao
2292 2 mingarao
2293 2 mingarao
<!--
2294 2 mingarao
  Whether an XML node precedes another without being its ancestor
2295 2 mingarao
2296 2 mingarao
 @author  W3C XML Query Working Group
2297 2 mingarao
 @version 1.0
2298 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_precedes-not-ancestor.html
2299 2 mingarao
 @param   $a the first node
2300 2 mingarao
 @param   $b the second node
2301 2 mingarao
-->
2302 2 mingarao
<xsl:function name="functx:precedes-not-ancestor" as="xs:boolean"
2303 2 mingarao
              xmlns:functx="http://www.functx.com" >
2304 2 mingarao
  <xsl:param name="a" as="node()?"/>
2305 2 mingarao
  <xsl:param name="b" as="node()?"/>
2306 2 mingarao
2307 2 mingarao
  <xsl:sequence select="
2308 2 mingarao
   $a &lt;&lt; $b and empty($a intersect $b/ancestor::node())
2309 2 mingarao
 "/>
2310 2 mingarao
2311 2 mingarao
</xsl:function>
2312 2 mingarao
2313 2 mingarao
2314 2 mingarao
<!--
2315 2 mingarao
  The previous day
2316 2 mingarao
2317 2 mingarao
 @author  Priscilla Walmsley, Datypic
2318 2 mingarao
 @version 1.0
2319 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_previous-day.html
2320 2 mingarao
 @param   $date the date
2321 2 mingarao
-->
2322 2 mingarao
<xsl:function name="functx:previous-day" as="xs:date?"
2323 2 mingarao
              xmlns:functx="http://www.functx.com" >
2324 2 mingarao
  <xsl:param name="date" as="xs:anyAtomicType?"/>
2325 2 mingarao
2326 2 mingarao
  <xsl:sequence select="
2327 2 mingarao
   xs:date($date) - xs:dayTimeDuration('P1D')
2328 2 mingarao
 "/>
2329 2 mingarao
2330 2 mingarao
</xsl:function>
2331 2 mingarao
2332 2 mingarao
2333 2 mingarao
<!--
2334 2 mingarao
  Removes attributes from an XML fragment, based on name
2335 2 mingarao
2336 2 mingarao
 @author  Priscilla Walmsley, Datypic
2337 2 mingarao
 @version 1.0
2338 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_remove-attributes-deep.html
2339 2 mingarao
 @param   $nodes the root(s) to start from
2340 2 mingarao
 @param   $names the names of the attributes to remove, or * for all attributes
2341 2 mingarao
-->
2342 2 mingarao
<xsl:function name="functx:remove-attributes-deep" as="node()*"
2343 2 mingarao
              xmlns:functx="http://www.functx.com" >
2344 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
2345 2 mingarao
  <xsl:param name="names" as="xs:string*"/>
2346 2 mingarao
2347 2 mingarao
   <xsl:for-each select="$nodes">
2348 2 mingarao
     <xsl:choose>
2349 2 mingarao
       <xsl:when test=". instance of element()">
2350 2 mingarao
         <xsl:element name="{node-name(.)}">
2351 2 mingarao
           <xsl:sequence select="
2352 2 mingarao
              (@*[not(functx:name-test(name(),$names))],
2353 2 mingarao
               functx:remove-attributes-deep(node(), $names))"/>
2354 2 mingarao
         </xsl:element>
2355 2 mingarao
       </xsl:when>
2356 2 mingarao
       <xsl:when test=". instance of document-node()">
2357 2 mingarao
         <xsl:document>
2358 2 mingarao
           <xsl:sequence select="
2359 2 mingarao
                functx:remove-attributes-deep(node(), $names)"/>
2360 2 mingarao
         </xsl:document>
2361 2 mingarao
       </xsl:when>
2362 2 mingarao
       <xsl:otherwise>
2363 2 mingarao
         <xsl:sequence select="."/>
2364 2 mingarao
       </xsl:otherwise>
2365 2 mingarao
     </xsl:choose>
2366 2 mingarao
   </xsl:for-each>
2367 2 mingarao
2368 2 mingarao
</xsl:function>
2369 2 mingarao
2370 2 mingarao
2371 2 mingarao
<!--
2372 2 mingarao
  Removes attributes from an XML element, based on name
2373 2 mingarao
2374 2 mingarao
 @author  Priscilla Walmsley, Datypic
2375 2 mingarao
 @version 1.0
2376 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_remove-attributes.html
2377 2 mingarao
 @param   $elements the element(s) from which to remove the attributes
2378 2 mingarao
 @param   $names the names of the attributes to remove, or * for all attributes
2379 2 mingarao
-->
2380 2 mingarao
<xsl:function name="functx:remove-attributes" as="element()"
2381 2 mingarao
              xmlns:functx="http://www.functx.com" >
2382 2 mingarao
  <xsl:param name="elements" as="element()*"/>
2383 2 mingarao
  <xsl:param name="names" as="xs:string*"/>
2384 2 mingarao
2385 2 mingarao
   <xsl:for-each select="$elements">
2386 2 mingarao
     <xsl:element name="{node-name(.)}">
2387 2 mingarao
       <xsl:sequence
2388 2 mingarao
         select="(@*[not(functx:name-test(name(),$names))],
2389 2 mingarao
                 node())"/>
2390 2 mingarao
     </xsl:element>
2391 2 mingarao
   </xsl:for-each>
2392 2 mingarao
2393 2 mingarao
</xsl:function>
2394 2 mingarao
2395 2 mingarao
2396 2 mingarao
<!--
2397 2 mingarao
  Removes descendant elements from an XML node, based on name
2398 2 mingarao
2399 2 mingarao
 @author  Priscilla Walmsley, Datypic
2400 2 mingarao
 @version 1.0
2401 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_remove-elements-deep.html
2402 2 mingarao
 @param   $nodes root(s) to start from
2403 2 mingarao
 @param   $names the names of the elements to remove
2404 2 mingarao
-->
2405 2 mingarao
<xsl:function name="functx:remove-elements-deep" as="node()*"
2406 2 mingarao
              xmlns:functx="http://www.functx.com" >
2407 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
2408 2 mingarao
  <xsl:param name="names" as="xs:string*"/>
2409 2 mingarao
2410 2 mingarao
   <xsl:for-each select="$nodes">
2411 2 mingarao
     <xsl:choose>
2412 2 mingarao
       <xsl:when test=". instance of element()">
2413 2 mingarao
         <xsl:if test="not(functx:name-test(name(),$names))">
2414 2 mingarao
           <xsl:element name="{node-name(.)}">
2415 2 mingarao
             <xsl:sequence select="@*,
2416 2 mingarao
                  functx:remove-elements-deep(node(), $names)"/>
2417 2 mingarao
           </xsl:element>
2418 2 mingarao
         </xsl:if>
2419 2 mingarao
       </xsl:when>
2420 2 mingarao
       <xsl:when test=". instance of document-node()">
2421 2 mingarao
         <xsl:document>
2422 2 mingarao
             <xsl:sequence select="
2423 2 mingarao
                  functx:remove-elements-deep(node(), $names)"/>
2424 2 mingarao
         </xsl:document>
2425 2 mingarao
       </xsl:when>
2426 2 mingarao
       <xsl:otherwise>
2427 2 mingarao
         <xsl:sequence select="."/>
2428 2 mingarao
       </xsl:otherwise>
2429 2 mingarao
     </xsl:choose>
2430 2 mingarao
   </xsl:for-each>
2431 2 mingarao
2432 2 mingarao
</xsl:function>
2433 2 mingarao
2434 2 mingarao
2435 2 mingarao
<!--
2436 2 mingarao
  Removes descendant XML elements but keeps their content
2437 2 mingarao
2438 2 mingarao
 @author  Priscilla Walmsley, Datypic
2439 2 mingarao
 @version 1.0
2440 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_remove-elements-not-contents.html
2441 2 mingarao
 @param   $nodes the root(s) to start from
2442 2 mingarao
 @param   $names the names of the elements to remove
2443 2 mingarao
-->
2444 2 mingarao
<xsl:function name="functx:remove-elements-not-contents" as="node()*"
2445 2 mingarao
              xmlns:functx="http://www.functx.com" >
2446 2 mingarao
  <xsl:param name="nodes" as="node()*"/>
2447 2 mingarao
  <xsl:param name="names" as="xs:string*"/>
2448 2 mingarao
2449 2 mingarao
   <xsl:for-each select="$nodes">
2450 2 mingarao
     <xsl:choose>
2451 2 mingarao
       <xsl:when test=". instance of element()">
2452 2 mingarao
         <xsl:choose>
2453 2 mingarao
           <xsl:when test="functx:name-test(name(),$names)">
2454 2 mingarao
             <xsl:sequence select="
2455 2 mingarao
                 functx:remove-elements-not-contents(node(), $names)"/>
2456 2 mingarao
           </xsl:when>
2457 2 mingarao
           <xsl:otherwise>
2458 2 mingarao
             <xsl:element name="{node-name(.)}">
2459 2 mingarao
               <xsl:sequence select="@*,
2460 2 mingarao
                 functx:remove-elements-not-contents(node(),$names)"/>
2461 2 mingarao
             </xsl:element>
2462 2 mingarao
           </xsl:otherwise>
2463 2 mingarao
         </xsl:choose>
2464 2 mingarao
       </xsl:when>
2465 2 mingarao
       <xsl:when test=". instance of document-node()">
2466 2 mingarao
         <xsl:document>
2467 2 mingarao
             <xsl:sequence select="
2468 2 mingarao
                 functx:remove-elements-not-contents(node(), $names)"/>
2469 2 mingarao
         </xsl:document>
2470 2 mingarao
       </xsl:when>
2471 2 mingarao
       <xsl:otherwise>
2472 2 mingarao
         <xsl:sequence select="."/>
2473 2 mingarao
       </xsl:otherwise>
2474 2 mingarao
     </xsl:choose>
2475 2 mingarao
   </xsl:for-each>
2476 2 mingarao
2477 2 mingarao
</xsl:function>
2478 2 mingarao
2479 2 mingarao
2480 2 mingarao
<!--
2481 2 mingarao
  Removes child elements from an XML node, based on name
2482 2 mingarao
2483 2 mingarao
 @author  Priscilla Walmsley, Datypic
2484 2 mingarao
 @version 1.0
2485 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_remove-elements.html
2486 2 mingarao
 @param   $elements the element(s) from which you wish to remove the children
2487 2 mingarao
 @param   $names the names of the child elements to remove
2488 2 mingarao
-->
2489 2 mingarao
<xsl:function name="functx:remove-elements" as="element()*"
2490 2 mingarao
              xmlns:functx="http://www.functx.com" >
2491 2 mingarao
  <xsl:param name="elements" as="element()*"/>
2492 2 mingarao
  <xsl:param name="names" as="xs:string*"/>
2493 2 mingarao
2494 2 mingarao
   <xsl:for-each select="$elements">
2495 2 mingarao
     <xsl:element name="{node-name(.)}">
2496 2 mingarao
       <xsl:sequence select="(@*,
2497 2 mingarao
      node()[not(functx:name-test(name(),$names))])"/>
2498 2 mingarao
     </xsl:element>
2499 2 mingarao
   </xsl:for-each>
2500 2 mingarao
2501 2 mingarao
</xsl:function>
2502 2 mingarao
2503 2 mingarao
2504 2 mingarao
<!--
2505 2 mingarao
  Repeats a string a given number of times
2506 2 mingarao
2507 2 mingarao
 @author  Priscilla Walmsley, Datypic
2508 2 mingarao
 @version 1.0
2509 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_repeat-string.html
2510 2 mingarao
 @param   $stringToRepeat the string to repeat
2511 2 mingarao
 @param   $count the desired number of copies
2512 2 mingarao
-->
2513 2 mingarao
<xsl:function name="functx:repeat-string" as="xs:string"
2514 2 mingarao
              xmlns:functx="http://www.functx.com" >
2515 2 mingarao
  <xsl:param name="stringToRepeat" as="xs:string?"/>
2516 2 mingarao
  <xsl:param name="count" as="xs:integer"/>
2517 2 mingarao
2518 2 mingarao
  <xsl:sequence select="
2519 2 mingarao
   string-join((for $i in 1 to $count return $stringToRepeat),
2520 2 mingarao
                        '')
2521 2 mingarao
 "/>
2522 2 mingarao
2523 2 mingarao
</xsl:function>
2524 2 mingarao
2525 2 mingarao
2526 2 mingarao
<!--
2527 2 mingarao
  Replaces the beginning of a string, up to a matched pattern
2528 2 mingarao
2529 2 mingarao
 @author  Priscilla Walmsley, Datypic
2530 2 mingarao
 @version 1.0
2531 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_replace-beginning.html
2532 2 mingarao
 @param   $arg the entire string to change
2533 2 mingarao
 @param   $pattern the pattern of characters to replace up to
2534 2 mingarao
 @param   $replacement the replacement string
2535 2 mingarao
-->
2536 2 mingarao
<xsl:function name="functx:replace-beginning" as="xs:string"
2537 2 mingarao
              xmlns:functx="http://www.functx.com" >
2538 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2539 2 mingarao
  <xsl:param name="pattern" as="xs:string"/>
2540 2 mingarao
  <xsl:param name="replacement" as="xs:string"/>
2541 2 mingarao
2542 2 mingarao
  <xsl:sequence select="
2543 2 mingarao
   replace($arg, concat('^.*?', $pattern), $replacement)
2544 2 mingarao
 "/>
2545 2 mingarao
2546 2 mingarao
</xsl:function>
2547 2 mingarao
2548 2 mingarao
2549 2 mingarao
<!--
2550 2 mingarao
  Updates the content of one or more elements
2551 2 mingarao
2552 2 mingarao
 @author  Priscilla Walmsley, Datypic
2553 2 mingarao
 @version 1.0
2554 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_replace-element-values.html
2555 2 mingarao
 @param   $elements the elements whose content you wish to replace
2556 2 mingarao
 @param   $values the replacement values
2557 2 mingarao
-->
2558 2 mingarao
<xsl:function name="functx:replace-element-values" as="element()*"
2559 2 mingarao
              xmlns:functx="http://www.functx.com" >
2560 2 mingarao
  <xsl:param name="elements" as="element()*"/>
2561 2 mingarao
  <xsl:param name="values" as="xs:anyAtomicType*"/>
2562 2 mingarao
2563 2 mingarao
   <xsl:for-each select="$elements">
2564 2 mingarao
     <xsl:variable name="seq" select="position()"/>
2565 2 mingarao
     <xsl:element name="{node-name(.)}">
2566 2 mingarao
       <xsl:sequence select="@*, $values[$seq]"/>
2567 2 mingarao
     </xsl:element>
2568 2 mingarao
   </xsl:for-each>
2569 2 mingarao
2570 2 mingarao
</xsl:function>
2571 2 mingarao
2572 2 mingarao
2573 2 mingarao
<!--
2574 2 mingarao
  Replaces the first match of a pattern
2575 2 mingarao
2576 2 mingarao
 @author  Priscilla Walmsley, Datypic
2577 2 mingarao
 @version 1.0
2578 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_replace-first.html
2579 2 mingarao
 @param   $arg the entire string to change
2580 2 mingarao
 @param   $pattern the pattern of characters to replace
2581 2 mingarao
 @param   $replacement the replacement string
2582 2 mingarao
-->
2583 2 mingarao
<xsl:function name="functx:replace-first" as="xs:string"
2584 2 mingarao
              xmlns:functx="http://www.functx.com" >
2585 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2586 2 mingarao
  <xsl:param name="pattern" as="xs:string"/>
2587 2 mingarao
  <xsl:param name="replacement" as="xs:string"/>
2588 2 mingarao
2589 2 mingarao
  <xsl:sequence select="
2590 2 mingarao
   replace($arg, concat('(^.*?)', $pattern),
2591 2 mingarao
             concat('$1',$replacement))
2592 2 mingarao
 "/>
2593 2 mingarao
2594 2 mingarao
</xsl:function>
2595 2 mingarao
2596 2 mingarao
2597 2 mingarao
<!--
2598 2 mingarao
  Performs multiple replacements, using pairs of replace parameters
2599 2 mingarao
2600 2 mingarao
 @author  Priscilla Walmsley, Datypic
2601 2 mingarao
 @version 1.0
2602 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_replace-multi.html
2603 2 mingarao
 @param   $arg the string to manipulate
2604 2 mingarao
 @param   $changeFrom the sequence of strings or patterns to change from
2605 2 mingarao
 @param   $changeTo the sequence of strings to change to
2606 2 mingarao
-->
2607 2 mingarao
<xsl:function name="functx:replace-multi" as="xs:string?"
2608 2 mingarao
              xmlns:functx="http://www.functx.com" >
2609 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2610 2 mingarao
  <xsl:param name="changeFrom" as="xs:string*"/>
2611 2 mingarao
  <xsl:param name="changeTo" as="xs:string*"/>
2612 2 mingarao
2613 2 mingarao
  <xsl:sequence select="
2614 2 mingarao
   if (count($changeFrom) > 0)
2615 2 mingarao
   then functx:replace-multi(
2616 2 mingarao
          replace($arg, $changeFrom[1],
2617 2 mingarao
                     functx:if-absent($changeTo[1],'')),
2618 2 mingarao
          $changeFrom[position() > 1],
2619 2 mingarao
          $changeTo[position() > 1])
2620 2 mingarao
   else $arg
2621 2 mingarao
 "/>
2622 2 mingarao
2623 2 mingarao
</xsl:function>
2624 2 mingarao
2625 2 mingarao
2626 2 mingarao
<!--
2627 2 mingarao
  Reverses the order of characters
2628 2 mingarao
2629 2 mingarao
 @author  Priscilla Walmsley, Datypic
2630 2 mingarao
 @version 1.0
2631 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_reverse-string.html
2632 2 mingarao
 @param   $arg the string to reverse
2633 2 mingarao
-->
2634 2 mingarao
<xsl:function name="functx:reverse-string" as="xs:string"
2635 2 mingarao
              xmlns:functx="http://www.functx.com" >
2636 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2637 2 mingarao
2638 2 mingarao
  <xsl:sequence select="
2639 2 mingarao
   codepoints-to-string(reverse(string-to-codepoints($arg)))
2640 2 mingarao
 "/>
2641 2 mingarao
2642 2 mingarao
</xsl:function>
2643 2 mingarao
2644 2 mingarao
2645 2 mingarao
<!--
2646 2 mingarao
  Trims trailing whitespace
2647 2 mingarao
2648 2 mingarao
 @author  Priscilla Walmsley, Datypic
2649 2 mingarao
 @version 1.0
2650 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_right-trim.html
2651 2 mingarao
 @param   $arg the string to trim
2652 2 mingarao
-->
2653 2 mingarao
<xsl:function name="functx:right-trim" as="xs:string"
2654 2 mingarao
              xmlns:functx="http://www.functx.com" >
2655 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2656 2 mingarao
2657 2 mingarao
  <xsl:sequence select="
2658 2 mingarao
   replace($arg,'\s+$','')
2659 2 mingarao
 "/>
2660 2 mingarao
2661 2 mingarao
</xsl:function>
2662 2 mingarao
2663 2 mingarao
2664 2 mingarao
<!--
2665 2 mingarao
  Returns the scheme from a URI
2666 2 mingarao
2667 2 mingarao
 @author  Priscilla Walmsley, Datypic
2668 2 mingarao
 @version 1.0
2669 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_scheme-from-uri.html
2670 2 mingarao
 @param   $uri the URI
2671 2 mingarao
-->
2672 2 mingarao
<xsl:function name="functx:scheme-from-uri" as="xs:string?"
2673 2 mingarao
              xmlns:functx="http://www.functx.com" >
2674 2 mingarao
  <xsl:param name="uri" as="xs:string?"/>
2675 2 mingarao
2676 2 mingarao
  <xsl:sequence select="
2677 2 mingarao
   substring-before($uri,':')
2678 2 mingarao
 "/>
2679 2 mingarao
2680 2 mingarao
</xsl:function>
2681 2 mingarao
2682 2 mingarao
2683 2 mingarao
<!--
2684 2 mingarao
  Whether two sequences have the same XML node content and/or values
2685 2 mingarao
2686 2 mingarao
 @author  Priscilla Walmsley, Datypic
2687 2 mingarao
 @version 1.0
2688 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_sequence-deep-equal.html
2689 2 mingarao
 @param   $seq1 the first sequence
2690 2 mingarao
 @param   $seq2 the second sequence
2691 2 mingarao
-->
2692 2 mingarao
<xsl:function name="functx:sequence-deep-equal" as="xs:boolean"
2693 2 mingarao
              xmlns:functx="http://www.functx.com" >
2694 2 mingarao
  <xsl:param name="seq1" as="item()*"/>
2695 2 mingarao
  <xsl:param name="seq2" as="item()*"/>
2696 2 mingarao
2697 2 mingarao
  <xsl:sequence select="
2698 2 mingarao
  every $i in 1 to max((count($seq1),count($seq2)))
2699 2 mingarao
  satisfies deep-equal($seq1[$i],$seq2[$i])
2700 2 mingarao
 "/>
2701 2 mingarao
2702 2 mingarao
</xsl:function>
2703 2 mingarao
2704 2 mingarao
2705 2 mingarao
<!--
2706 2 mingarao
  Whether two sequences contain the same XML nodes, regardless of order
2707 2 mingarao
2708 2 mingarao
 @author  Priscilla Walmsley, Datypic
2709 2 mingarao
 @version 1.0
2710 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_sequence-node-equal-any-order.html
2711 2 mingarao
 @param   $seq1 the first sequence of nodes
2712 2 mingarao
 @param   $seq2 the second sequence of nodes
2713 2 mingarao
-->
2714 2 mingarao
<xsl:function name="functx:sequence-node-equal-any-order" as="xs:boolean"
2715 2 mingarao
              xmlns:functx="http://www.functx.com" >
2716 2 mingarao
  <xsl:param name="seq1" as="node()*"/>
2717 2 mingarao
  <xsl:param name="seq2" as="node()*"/>
2718 2 mingarao
2719 2 mingarao
  <xsl:sequence select="
2720 2 mingarao
  not( ($seq1 except $seq2, $seq2 except $seq1))
2721 2 mingarao
 "/>
2722 2 mingarao
2723 2 mingarao
</xsl:function>
2724 2 mingarao
2725 2 mingarao
2726 2 mingarao
<!--
2727 2 mingarao
  Whether two sequences contain the same XML nodes, in the same order
2728 2 mingarao
2729 2 mingarao
 @author  Priscilla Walmsley, Datypic
2730 2 mingarao
 @version 1.0
2731 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_sequence-node-equal.html
2732 2 mingarao
 @param   $seq1 the first sequence of nodes
2733 2 mingarao
 @param   $seq2 the second sequence of nodes
2734 2 mingarao
-->
2735 2 mingarao
<xsl:function name="functx:sequence-node-equal" as="xs:boolean"
2736 2 mingarao
              xmlns:functx="http://www.functx.com" >
2737 2 mingarao
  <xsl:param name="seq1" as="node()*"/>
2738 2 mingarao
  <xsl:param name="seq2" as="node()*"/>
2739 2 mingarao
2740 2 mingarao
  <xsl:sequence select="
2741 2 mingarao
  every $i in 1 to max((count($seq1),count($seq2)))
2742 2 mingarao
  satisfies $seq1[$i] is $seq2[$i]
2743 2 mingarao
 "/>
2744 2 mingarao
2745 2 mingarao
</xsl:function>
2746 2 mingarao
2747 2 mingarao
2748 2 mingarao
<!--
2749 2 mingarao
  The sequence type that represents a sequence of nodes or values
2750 2 mingarao
2751 2 mingarao
 @author  Priscilla Walmsley, Datypic
2752 2 mingarao
 @version 1.0
2753 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_sequence-type.html
2754 2 mingarao
 @param   $items the items whose sequence type you want to determine
2755 2 mingarao
-->
2756 2 mingarao
<xsl:function name="functx:sequence-type" as="xs:string"
2757 2 mingarao
              xmlns:functx="http://www.functx.com" >
2758 2 mingarao
  <xsl:param name="items" as="item()*"/>
2759 2 mingarao
2760 2 mingarao
  <xsl:sequence select="
2761 2 mingarao
concat(
2762 2 mingarao
  if (empty($items))
2763 2 mingarao
  then 'empty-sequence()'
2764 2 mingarao
  else if (every $val in $items
2765 2 mingarao
           satisfies $val instance of xs:anyAtomicType)
2766 2 mingarao
  then if (count(distinct-values(functx:atomic-type($items)))
2767 2 mingarao
           > 1)
2768 2 mingarao
  then 'xs:anyAtomicType'
2769 2 mingarao
  else functx:atomic-type($items[1])
2770 2 mingarao
  else if (some $val in $items
2771 2 mingarao
           satisfies $val instance of xs:anyAtomicType)
2772 2 mingarao
  then 'item()'
2773 2 mingarao
  else if (count(distinct-values(functx:node-kind($items))) > 1)
2774 2 mingarao
  then 'node()'
2775 2 mingarao
  else concat(functx:node-kind($items[1]),'()')
2776 2 mingarao
  ,
2777 2 mingarao
  if (count($items) > 1)
2778 2 mingarao
  then '+' else '')
2779 2 mingarao
   "/>
2780 2 mingarao
2781 2 mingarao
</xsl:function>
2782 2 mingarao
2783 2 mingarao
2784 2 mingarao
<!--
2785 2 mingarao
  The siblings of an XML element that have the same name
2786 2 mingarao
2787 2 mingarao
 @author  Priscilla Walmsley, Datypic
2788 2 mingarao
 @version 1.0
2789 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_siblings-same-name.html
2790 2 mingarao
 @param   $element the node
2791 2 mingarao
-->
2792 2 mingarao
<xsl:function name="functx:siblings-same-name" as="element()*"
2793 2 mingarao
              xmlns:functx="http://www.functx.com" >
2794 2 mingarao
  <xsl:param name="element" as="element()?"/>
2795 2 mingarao
2796 2 mingarao
  <xsl:sequence select="
2797 2 mingarao
   $element/../*[node-name(.) = node-name($element)]
2798 2 mingarao
   except $element
2799 2 mingarao
 "/>
2800 2 mingarao
2801 2 mingarao
</xsl:function>
2802 2 mingarao
2803 2 mingarao
2804 2 mingarao
<!--
2805 2 mingarao
  The siblings of an XML node
2806 2 mingarao
2807 2 mingarao
 @author  Priscilla Walmsley, Datypic
2808 2 mingarao
 @version 1.0
2809 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_siblings.html
2810 2 mingarao
 @param   $node the node
2811 2 mingarao
-->
2812 2 mingarao
<xsl:function name="functx:siblings" as="node()*"
2813 2 mingarao
              xmlns:functx="http://www.functx.com" >
2814 2 mingarao
  <xsl:param name="node" as="node()?"/>
2815 2 mingarao
2816 2 mingarao
  <xsl:sequence select="
2817 2 mingarao
   $node/../node() except $node
2818 2 mingarao
 "/>
2819 2 mingarao
2820 2 mingarao
</xsl:function>
2821 2 mingarao
2822 2 mingarao
2823 2 mingarao
<!--
2824 2 mingarao
  Sorts a sequence of numeric values or nodes
2825 2 mingarao
2826 2 mingarao
 @author  Priscilla Walmsley, Datypic
2827 2 mingarao
 @version 1.0
2828 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_sort-as-numeric.html
2829 2 mingarao
 @param   $seq the sequence to sort
2830 2 mingarao
-->
2831 2 mingarao
<xsl:function name="functx:sort-as-numeric" as="item()*"
2832 2 mingarao
              xmlns:functx="http://www.functx.com" >
2833 2 mingarao
  <xsl:param name="seq" as="item()*"/>
2834 2 mingarao
2835 2 mingarao
   <xsl:for-each select="$seq">
2836 2 mingarao
     <xsl:sort select="number(.)"/>
2837 2 mingarao
     <xsl:copy-of select="."/>
2838 2 mingarao
   </xsl:for-each>
2839 2 mingarao
2840 2 mingarao
</xsl:function>
2841 2 mingarao
2842 2 mingarao
2843 2 mingarao
<!--
2844 2 mingarao
  Sorts a sequence of values or nodes regardless of capitalization
2845 2 mingarao
2846 2 mingarao
 @author  Priscilla Walmsley, Datypic
2847 2 mingarao
 @version 1.0
2848 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_sort-case-insensitive.html
2849 2 mingarao
 @param   $seq the sequence to sort
2850 2 mingarao
-->
2851 2 mingarao
<xsl:function name="functx:sort-case-insensitive" as="item()*"
2852 2 mingarao
              xmlns:functx="http://www.functx.com" >
2853 2 mingarao
  <xsl:param name="seq" as="item()*"/>
2854 2 mingarao
2855 2 mingarao
   <xsl:for-each select="$seq">
2856 2 mingarao
     <xsl:sort select="upper-case(string(.))"/>
2857 2 mingarao
     <xsl:copy-of select="."/>
2858 2 mingarao
   </xsl:for-each>
2859 2 mingarao
2860 2 mingarao
</xsl:function>
2861 2 mingarao
2862 2 mingarao
2863 2 mingarao
<!--
2864 2 mingarao
  Sorts a sequence of nodes in document order
2865 2 mingarao
2866 2 mingarao
 @author  Priscilla Walmsley, Datypic
2867 2 mingarao
 @version 1.0
2868 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_sort-document-order.html
2869 2 mingarao
 @param   $seq the sequence to sort
2870 2 mingarao
-->
2871 2 mingarao
<xsl:function name="functx:sort-document-order" as="node()*"
2872 2 mingarao
              xmlns:functx="http://www.functx.com" >
2873 2 mingarao
  <xsl:param name="seq" as="node()*"/>
2874 2 mingarao
2875 2 mingarao
  <xsl:sequence select="
2876 2 mingarao
   $seq/.
2877 2 mingarao
 "/>
2878 2 mingarao
2879 2 mingarao
</xsl:function>
2880 2 mingarao
2881 2 mingarao
2882 2 mingarao
<!--
2883 2 mingarao
  Sorts a sequence of values or nodes
2884 2 mingarao
2885 2 mingarao
 @author  Priscilla Walmsley, Datypic
2886 2 mingarao
 @version 1.0
2887 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_sort.html
2888 2 mingarao
 @param   $seq the sequence to sort
2889 2 mingarao
-->
2890 2 mingarao
<xsl:function name="functx:sort" as="item()*"
2891 2 mingarao
              xmlns:functx="http://www.functx.com" >
2892 2 mingarao
  <xsl:param name="seq" as="item()*"/>
2893 2 mingarao
2894 2 mingarao
   <xsl:for-each select="$seq">
2895 2 mingarao
     <xsl:sort select="."/>
2896 2 mingarao
     <xsl:copy-of select="."/>
2897 2 mingarao
   </xsl:for-each>
2898 2 mingarao
2899 2 mingarao
</xsl:function>
2900 2 mingarao
2901 2 mingarao
2902 2 mingarao
<!--
2903 2 mingarao
  Performs substring-after, returning the entire string if it does not contain the delimiter
2904 2 mingarao
2905 2 mingarao
 @author  Priscilla Walmsley, Datypic
2906 2 mingarao
 @version 1.0
2907 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_substring-after-if-contains.html
2908 2 mingarao
 @param   $arg the string to substring
2909 2 mingarao
 @param   $delim the delimiter
2910 2 mingarao
-->
2911 2 mingarao
<xsl:function name="functx:substring-after-if-contains" as="xs:string?"
2912 2 mingarao
              xmlns:functx="http://www.functx.com" >
2913 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2914 2 mingarao
  <xsl:param name="delim" as="xs:string"/>
2915 2 mingarao
2916 2 mingarao
  <xsl:sequence select="
2917 2 mingarao
   if (contains($arg,$delim))
2918 2 mingarao
   then substring-after($arg,$delim)
2919 2 mingarao
   else $arg
2920 2 mingarao
 "/>
2921 2 mingarao
2922 2 mingarao
</xsl:function>
2923 2 mingarao
2924 2 mingarao
2925 2 mingarao
<!--
2926 2 mingarao
  The substring after the last text that matches a regex
2927 2 mingarao
2928 2 mingarao
 @author  Priscilla Walmsley, Datypic
2929 2 mingarao
 @version 1.0
2930 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_substring-after-last-match.html
2931 2 mingarao
 @param   $arg the string to substring
2932 2 mingarao
 @param   $regex the regular expression
2933 2 mingarao
-->
2934 2 mingarao
<xsl:function name="functx:substring-after-last-match" as="xs:string"
2935 2 mingarao
              xmlns:functx="http://www.functx.com" >
2936 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2937 2 mingarao
  <xsl:param name="regex" as="xs:string"/>
2938 2 mingarao
2939 2 mingarao
  <xsl:sequence select="
2940 2 mingarao
   replace($arg,concat('^.*',$regex),'')
2941 2 mingarao
 "/>
2942 2 mingarao
2943 2 mingarao
</xsl:function>
2944 2 mingarao
2945 2 mingarao
2946 2 mingarao
<!--
2947 2 mingarao
  The substring after the last occurrence of a delimiter
2948 2 mingarao
2949 2 mingarao
 @author  Priscilla Walmsley, Datypic
2950 2 mingarao
 @version 1.0
2951 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_substring-after-last.html
2952 2 mingarao
 @param   $arg the string to substring
2953 2 mingarao
 @param   $delim the delimiter
2954 2 mingarao
-->
2955 2 mingarao
<xsl:function name="functx:substring-after-last" as="xs:string"
2956 2 mingarao
              xmlns:functx="http://www.functx.com" >
2957 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2958 2 mingarao
  <xsl:param name="delim" as="xs:string"/>
2959 2 mingarao
2960 2 mingarao
  <xsl:sequence select="
2961 2 mingarao
   replace ($arg,concat('^.*',functx:escape-for-regex($delim)),'')
2962 2 mingarao
 "/>
2963 2 mingarao
2964 2 mingarao
</xsl:function>
2965 2 mingarao
2966 2 mingarao
2967 2 mingarao
<!--
2968 2 mingarao
  The substring after the first text that matches a regex
2969 2 mingarao
2970 2 mingarao
 @author  Priscilla Walmsley, Datypic
2971 2 mingarao
 @version 1.0
2972 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_substring-after-match.html
2973 2 mingarao
 @param   $arg the string to substring
2974 2 mingarao
 @param   $regex the regular expression
2975 2 mingarao
-->
2976 2 mingarao
<xsl:function name="functx:substring-after-match" as="xs:string?"
2977 2 mingarao
              xmlns:functx="http://www.functx.com" >
2978 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
2979 2 mingarao
  <xsl:param name="regex" as="xs:string"/>
2980 2 mingarao
2981 2 mingarao
  <xsl:sequence select="
2982 2 mingarao
   replace($arg,concat('^.*?',$regex),'')
2983 2 mingarao
 "/>
2984 2 mingarao
2985 2 mingarao
</xsl:function>
2986 2 mingarao
2987 2 mingarao
2988 2 mingarao
<!--
2989 2 mingarao
  Performs substring-before, returning the entire string if it does not contain the delimiter
2990 2 mingarao
2991 2 mingarao
 @author  Priscilla Walmsley, Datypic
2992 2 mingarao
 @version 1.0
2993 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_substring-before-if-contains.html
2994 2 mingarao
 @param   $arg the string to substring
2995 2 mingarao
 @param   $delim the delimiter
2996 2 mingarao
-->
2997 2 mingarao
<xsl:function name="functx:substring-before-if-contains" as="xs:string?"
2998 2 mingarao
              xmlns:functx="http://www.functx.com" >
2999 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
3000 2 mingarao
  <xsl:param name="delim" as="xs:string"/>
3001 2 mingarao
3002 2 mingarao
  <xsl:sequence select="
3003 2 mingarao
   if (contains($arg,$delim))
3004 2 mingarao
   then substring-before($arg,$delim)
3005 2 mingarao
   else $arg
3006 2 mingarao
 "/>
3007 2 mingarao
3008 2 mingarao
</xsl:function>
3009 2 mingarao
3010 2 mingarao
3011 2 mingarao
<!--
3012 2 mingarao
  The substring after the first text that matches a regex
3013 2 mingarao
3014 2 mingarao
 @author  Priscilla Walmsley, Datypic
3015 2 mingarao
 @version 1.0
3016 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_substring-before-last-match.html
3017 2 mingarao
 @param   $arg the string to substring
3018 2 mingarao
 @param   $regex the regular expression
3019 2 mingarao
-->
3020 2 mingarao
<xsl:function name="functx:substring-before-last-match" as="xs:string?"
3021 2 mingarao
              xmlns:functx="http://www.functx.com" >
3022 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
3023 2 mingarao
  <xsl:param name="regex" as="xs:string"/>
3024 2 mingarao
3025 2 mingarao
  <xsl:sequence select="
3026 2 mingarao
   replace($arg,concat('^(.*)',$regex,'.*'),'$1')
3027 2 mingarao
 "/>
3028 2 mingarao
3029 2 mingarao
</xsl:function>
3030 2 mingarao
3031 2 mingarao
3032 2 mingarao
<!--
3033 2 mingarao
  The substring before the last occurrence of a delimiter
3034 2 mingarao
3035 2 mingarao
 @author  Priscilla Walmsley, Datypic
3036 2 mingarao
 @version 1.0
3037 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_substring-before-last.html
3038 2 mingarao
 @param   $arg the string to substring
3039 2 mingarao
 @param   $delim the delimiter
3040 2 mingarao
-->
3041 2 mingarao
<xsl:function name="functx:substring-before-last" as="xs:string"
3042 2 mingarao
              xmlns:functx="http://www.functx.com" >
3043 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
3044 2 mingarao
  <xsl:param name="delim" as="xs:string"/>
3045 2 mingarao
3046 2 mingarao
  <xsl:sequence select="
3047 2 mingarao
   if (matches($arg, functx:escape-for-regex($delim)))
3048 2 mingarao
   then replace($arg,
3049 2 mingarao
            concat('^(.*)', functx:escape-for-regex($delim),'.*'),
3050 2 mingarao
            '$1')
3051 2 mingarao
   else ''
3052 2 mingarao
 "/>
3053 2 mingarao
3054 2 mingarao
</xsl:function>
3055 2 mingarao
3056 2 mingarao
3057 2 mingarao
<!--
3058 2 mingarao
  The substring before the last text that matches a regex
3059 2 mingarao
3060 2 mingarao
 @author  Priscilla Walmsley, Datypic
3061 2 mingarao
 @version 1.0
3062 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_substring-before-match.html
3063 2 mingarao
 @param   $arg the string to substring
3064 2 mingarao
 @param   $regex the regular expression
3065 2 mingarao
-->
3066 2 mingarao
<xsl:function name="functx:substring-before-match" as="xs:string"
3067 2 mingarao
              xmlns:functx="http://www.functx.com" >
3068 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
3069 2 mingarao
  <xsl:param name="regex" as="xs:string"/>
3070 2 mingarao
3071 2 mingarao
  <xsl:sequence select="
3072 2 mingarao
   tokenize($arg,$regex)[1]
3073 2 mingarao
 "/>
3074 2 mingarao
3075 2 mingarao
</xsl:function>
3076 2 mingarao
3077 2 mingarao
3078 2 mingarao
<!--
3079 2 mingarao
  Construct a time from an hour, minute and second
3080 2 mingarao
3081 2 mingarao
 @author  Priscilla Walmsley, Datypic
3082 2 mingarao
 @version 1.0
3083 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_time.html
3084 2 mingarao
 @param   $hour the hour
3085 2 mingarao
 @param   $minute the minute
3086 2 mingarao
 @param   $second the second
3087 2 mingarao
-->
3088 2 mingarao
<xsl:function name="functx:time" as="xs:time"
3089 2 mingarao
              xmlns:functx="http://www.functx.com" >
3090 2 mingarao
  <xsl:param name="hour" as="xs:anyAtomicType"/>
3091 2 mingarao
  <xsl:param name="minute" as="xs:anyAtomicType"/>
3092 2 mingarao
  <xsl:param name="second" as="xs:anyAtomicType"/>
3093 2 mingarao
3094 2 mingarao
  <xsl:sequence select="
3095 2 mingarao
   xs:time(
3096 2 mingarao
     concat(
3097 2 mingarao
       functx:pad-integer-to-length(xs:integer($hour),2),':',
3098 2 mingarao
       functx:pad-integer-to-length(xs:integer($minute),2),':',
3099 2 mingarao
       functx:pad-integer-to-length(xs:integer($second),2)))
3100 2 mingarao
 "/>
3101 2 mingarao
3102 2 mingarao
</xsl:function>
3103 2 mingarao
3104 2 mingarao
3105 2 mingarao
<!--
3106 2 mingarao
  Converts an xs:dayTimeDuration into a timezone like "-05:00" or "Z"
3107 2 mingarao
3108 2 mingarao
 @author  Priscilla Walmsley, Datypic
3109 2 mingarao
 @version 1.0
3110 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_timezone-from-duration.html
3111 2 mingarao
 @param   $duration the duration
3112 2 mingarao
-->
3113 2 mingarao
<xsl:function name="functx:timezone-from-duration" as="xs:string"
3114 2 mingarao
              xmlns:functx="http://www.functx.com" >
3115 2 mingarao
  <xsl:param name="duration" as="xs:dayTimeDuration"/>
3116 2 mingarao
3117 2 mingarao
  <xsl:sequence select="
3118 2 mingarao
   if (string($duration) = ('PT0S','-PT0S'))
3119 2 mingarao
   then 'Z'
3120 2 mingarao
   else if (matches(string($duration),'-PT[1-9]H'))
3121 2 mingarao
   then replace(string($duration),'PT([1-9])H','0$1:00')
3122 2 mingarao
   else if (matches(string($duration),'PT[1-9]H'))
3123 2 mingarao
   then replace(string($duration),'PT([1-9])H','+0$1:00')
3124 2 mingarao
   else if (matches(string($duration),'-PT1[0-4]H'))
3125 2 mingarao
   then replace(string($duration),'PT(1[0-4])H','$1:00')
3126 2 mingarao
   else if (matches(string($duration),'PT1[0-4]H'))
3127 2 mingarao
   then replace(string($duration),'PT(1[0-4])H','+$1:00')
3128 2 mingarao
   else error(xs:QName('functx:Invalid_Duration_Value'))
3129 2 mingarao
 "/>
3130 2 mingarao
3131 2 mingarao
</xsl:function>
3132 2 mingarao
3133 2 mingarao
3134 2 mingarao
<!--
3135 2 mingarao
  The total number of days in a dayTimeDuration
3136 2 mingarao
3137 2 mingarao
 @author  Priscilla Walmsley, Datypic
3138 2 mingarao
 @version 1.0
3139 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_total-days-from-duration.html
3140 2 mingarao
 @param   $duration the duration
3141 2 mingarao
-->
3142 2 mingarao
<xsl:function name="functx:total-days-from-duration" as="xs:decimal?"
3143 2 mingarao
              xmlns:functx="http://www.functx.com" >
3144 2 mingarao
  <xsl:param name="duration" as="xs:dayTimeDuration?"/>
3145 2 mingarao
3146 2 mingarao
  <xsl:sequence select="
3147 2 mingarao
   $duration div xs:dayTimeDuration('P1D')
3148 2 mingarao
 "/>
3149 2 mingarao
3150 2 mingarao
</xsl:function>
3151 2 mingarao
3152 2 mingarao
3153 2 mingarao
<!--
3154 2 mingarao
  The total number of hours in a dayTimeDuration
3155 2 mingarao
3156 2 mingarao
 @author  Priscilla Walmsley, Datypic
3157 2 mingarao
 @version 1.0
3158 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_total-hours-from-duration.html
3159 2 mingarao
 @param   $duration the duration
3160 2 mingarao
-->
3161 2 mingarao
<xsl:function name="functx:total-hours-from-duration" as="xs:decimal?"
3162 2 mingarao
              xmlns:functx="http://www.functx.com" >
3163 2 mingarao
  <xsl:param name="duration" as="xs:dayTimeDuration?"/>
3164 2 mingarao
3165 2 mingarao
  <xsl:sequence select="
3166 2 mingarao
   $duration div xs:dayTimeDuration('PT1H')
3167 2 mingarao
 "/>
3168 2 mingarao
3169 2 mingarao
</xsl:function>
3170 2 mingarao
3171 2 mingarao
3172 2 mingarao
<!--
3173 2 mingarao
  The total number of minutes in a dayTimeDuration
3174 2 mingarao
3175 2 mingarao
 @author  Priscilla Walmsley, Datypic
3176 2 mingarao
 @version 1.0
3177 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_total-minutes-from-duration.html
3178 2 mingarao
 @param   $duration the duration
3179 2 mingarao
-->
3180 2 mingarao
<xsl:function name="functx:total-minutes-from-duration" as="xs:decimal?"
3181 2 mingarao
              xmlns:functx="http://www.functx.com" >
3182 2 mingarao
  <xsl:param name="duration" as="xs:dayTimeDuration?"/>
3183 2 mingarao
3184 2 mingarao
  <xsl:sequence select="
3185 2 mingarao
   $duration div xs:dayTimeDuration('PT1M')
3186 2 mingarao
 "/>
3187 2 mingarao
3188 2 mingarao
</xsl:function>
3189 2 mingarao
3190 2 mingarao
3191 2 mingarao
<!--
3192 2 mingarao
  The total number of months in a yearMonthDuration
3193 2 mingarao
3194 2 mingarao
 @author  Priscilla Walmsley, Datypic
3195 2 mingarao
 @version 1.0
3196 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_total-months-from-duration.html
3197 2 mingarao
 @param   $duration the duration
3198 2 mingarao
-->
3199 2 mingarao
<xsl:function name="functx:total-months-from-duration" as="xs:decimal?"
3200 2 mingarao
              xmlns:functx="http://www.functx.com" >
3201 2 mingarao
  <xsl:param name="duration" as="xs:yearMonthDuration?"/>
3202 2 mingarao
3203 2 mingarao
  <xsl:sequence select="
3204 2 mingarao
   $duration div xs:yearMonthDuration('P1M')
3205 2 mingarao
 "/>
3206 2 mingarao
3207 2 mingarao
</xsl:function>
3208 2 mingarao
3209 2 mingarao
3210 2 mingarao
<!--
3211 2 mingarao
  The total number of seconds in a dayTimeDuration
3212 2 mingarao
3213 2 mingarao
 @author  Priscilla Walmsley, Datypic
3214 2 mingarao
 @version 1.0
3215 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_total-seconds-from-duration.html
3216 2 mingarao
 @param   $duration the duration
3217 2 mingarao
-->
3218 2 mingarao
<xsl:function name="functx:total-seconds-from-duration" as="xs:decimal?"
3219 2 mingarao
              xmlns:functx="http://www.functx.com" >
3220 2 mingarao
  <xsl:param name="duration" as="xs:dayTimeDuration?"/>
3221 2 mingarao
3222 2 mingarao
  <xsl:sequence select="
3223 2 mingarao
   $duration div xs:dayTimeDuration('PT1S')
3224 2 mingarao
 "/>
3225 2 mingarao
3226 2 mingarao
</xsl:function>
3227 2 mingarao
3228 2 mingarao
3229 2 mingarao
<!--
3230 2 mingarao
  The total number of years in a yearMonthDuration
3231 2 mingarao
3232 2 mingarao
 @author  Priscilla Walmsley, Datypic
3233 2 mingarao
 @version 1.0
3234 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_total-years-from-duration.html
3235 2 mingarao
 @param   $duration the duration
3236 2 mingarao
-->
3237 2 mingarao
<xsl:function name="functx:total-years-from-duration" as="xs:decimal?"
3238 2 mingarao
              xmlns:functx="http://www.functx.com" >
3239 2 mingarao
  <xsl:param name="duration" as="xs:yearMonthDuration?"/>
3240 2 mingarao
3241 2 mingarao
  <xsl:sequence select="
3242 2 mingarao
   $duration div xs:yearMonthDuration('P1Y')
3243 2 mingarao
 "/>
3244 2 mingarao
3245 2 mingarao
</xsl:function>
3246 2 mingarao
3247 2 mingarao
3248 2 mingarao
<!--
3249 2 mingarao
  Trims leading and trailing whitespace
3250 2 mingarao
3251 2 mingarao
 @author  Priscilla Walmsley, Datypic
3252 2 mingarao
 @version 1.0
3253 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_trim.html
3254 2 mingarao
 @param   $arg the string to trim
3255 2 mingarao
-->
3256 2 mingarao
<xsl:function name="functx:trim" as="xs:string"
3257 2 mingarao
              xmlns:functx="http://www.functx.com" >
3258 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
3259 2 mingarao
3260 2 mingarao
  <xsl:sequence select="
3261 2 mingarao
   replace(replace($arg,'\s+$',''),'^\s+','')
3262 2 mingarao
 "/>
3263 2 mingarao
3264 2 mingarao
</xsl:function>
3265 2 mingarao
3266 2 mingarao
3267 2 mingarao
<!--
3268 2 mingarao
  Updates the attribute value of an XML element
3269 2 mingarao
3270 2 mingarao
 @author  Priscilla Walmsley, Datypic
3271 2 mingarao
 @version 1.0
3272 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_update-attributes.html
3273 2 mingarao
 @param   $elements the element(s) for which you wish to update the attribute
3274 2 mingarao
 @param   $attrNames the name(s) of the attribute(s) to add
3275 2 mingarao
 @param   $attrValues the value(s) of the attribute(s) to add
3276 2 mingarao
-->
3277 2 mingarao
<xsl:function name="functx:update-attributes" as="element()?"
3278 2 mingarao
              xmlns:functx="http://www.functx.com" >
3279 2 mingarao
  <xsl:param name="elements" as="element()*"/>
3280 2 mingarao
  <xsl:param name="attrNames" as="xs:QName*"/>
3281 2 mingarao
  <xsl:param name="attrValues" as="xs:anyAtomicType*"/>
3282 2 mingarao
3283 2 mingarao
  <xsl:for-each select="$elements">
3284 2 mingarao
    <xsl:variable name="element" select="."/>
3285 2 mingarao
    <xsl:copy>
3286 2 mingarao
      <xsl:for-each select="$attrNames">
3287 2 mingarao
        <xsl:variable name="seq" select="position()"/>
3288 2 mingarao
        <xsl:if test="$element/@*[node-name(.) = current()]">
3289 2 mingarao
          <xsl:attribute name="{.}"
3290 2 mingarao
                         namespace="{namespace-uri-from-QName(.)}"
3291 2 mingarao
                         select="$attrValues[$seq]"/>
3292 2 mingarao
        </xsl:if>
3293 2 mingarao
      </xsl:for-each>
3294 2 mingarao
      <xsl:copy-of select="@*[not(node-name(.) = $attrNames)]|node()"/>
3295 2 mingarao
    </xsl:copy>
3296 2 mingarao
  </xsl:for-each>
3297 2 mingarao
3298 2 mingarao
</xsl:function>
3299 2 mingarao
3300 2 mingarao
3301 2 mingarao
<!--
3302 2 mingarao
  The values in one sequence that aren't in another sequence
3303 2 mingarao
3304 2 mingarao
 @author  W3C XML Query Working Group
3305 2 mingarao
 @version 1.0
3306 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_value-except.html
3307 2 mingarao
 @param   $arg1 the first sequence
3308 2 mingarao
 @param   $arg2 the second sequence
3309 2 mingarao
-->
3310 2 mingarao
<xsl:function name="functx:value-except" as="xs:anyAtomicType*"
3311 2 mingarao
              xmlns:functx="http://www.functx.com" >
3312 2 mingarao
  <xsl:param name="arg1" as="xs:anyAtomicType*"/>
3313 2 mingarao
  <xsl:param name="arg2" as="xs:anyAtomicType*"/>
3314 2 mingarao
3315 2 mingarao
  <xsl:sequence select="
3316 2 mingarao
  distinct-values($arg1[not(.=$arg2)])
3317 2 mingarao
 "/>
3318 2 mingarao
3319 2 mingarao
</xsl:function>
3320 2 mingarao
3321 2 mingarao
3322 2 mingarao
<!--
3323 2 mingarao
  The intersection of two sequences of values
3324 2 mingarao
3325 2 mingarao
 @author  W3C XML Query Working Group
3326 2 mingarao
 @version 1.0
3327 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_value-intersect.html
3328 2 mingarao
 @param   $arg1 the first sequence
3329 2 mingarao
 @param   $arg2 the second sequence
3330 2 mingarao
-->
3331 2 mingarao
<xsl:function name="functx:value-intersect" as="xs:anyAtomicType*"
3332 2 mingarao
              xmlns:functx="http://www.functx.com" >
3333 2 mingarao
  <xsl:param name="arg1" as="xs:anyAtomicType*"/>
3334 2 mingarao
  <xsl:param name="arg2" as="xs:anyAtomicType*"/>
3335 2 mingarao
3336 2 mingarao
  <xsl:sequence select="
3337 2 mingarao
  distinct-values($arg1[.=$arg2])
3338 2 mingarao
 "/>
3339 2 mingarao
3340 2 mingarao
</xsl:function>
3341 2 mingarao
3342 2 mingarao
3343 2 mingarao
<!--
3344 2 mingarao
  The union of two sequences of values
3345 2 mingarao
3346 2 mingarao
 @author  W3C XML Query Working Group
3347 2 mingarao
 @version 1.0
3348 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_value-union.html
3349 2 mingarao
 @param   $arg1 the first sequence
3350 2 mingarao
 @param   $arg2 the second sequence
3351 2 mingarao
-->
3352 2 mingarao
<xsl:function name="functx:value-union" as="xs:anyAtomicType*"
3353 2 mingarao
              xmlns:functx="http://www.functx.com" >
3354 2 mingarao
  <xsl:param name="arg1" as="xs:anyAtomicType*"/>
3355 2 mingarao
  <xsl:param name="arg2" as="xs:anyAtomicType*"/>
3356 2 mingarao
3357 2 mingarao
  <xsl:sequence select="
3358 2 mingarao
  distinct-values(($arg1, $arg2))
3359 2 mingarao
 "/>
3360 2 mingarao
3361 2 mingarao
</xsl:function>
3362 2 mingarao
3363 2 mingarao
3364 2 mingarao
<!--
3365 2 mingarao
  The number of words
3366 2 mingarao
3367 2 mingarao
 @author  Priscilla Walmsley, Datypic
3368 2 mingarao
 @version 1.0
3369 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_word-count.html
3370 2 mingarao
 @param   $arg the string to measure
3371 2 mingarao
-->
3372 2 mingarao
<xsl:function name="functx:word-count" as="xs:integer"
3373 2 mingarao
              xmlns:functx="http://www.functx.com" >
3374 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
3375 2 mingarao
3376 2 mingarao
  <xsl:sequence select="
3377 2 mingarao
   count(tokenize($arg, '\W+')[. != ''])
3378 2 mingarao
 "/>
3379 2 mingarao
3380 2 mingarao
</xsl:function>
3381 2 mingarao
3382 2 mingarao
3383 2 mingarao
<!--
3384 2 mingarao
  Turns a string of words into camelCase
3385 2 mingarao
3386 2 mingarao
 @author  Priscilla Walmsley, Datypic
3387 2 mingarao
 @version 1.0
3388 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_words-to-camel-case.html
3389 2 mingarao
 @param   $arg the string to modify
3390 2 mingarao
-->
3391 2 mingarao
<xsl:function name="functx:words-to-camel-case" as="xs:string"
3392 2 mingarao
              xmlns:functx="http://www.functx.com" >
3393 2 mingarao
  <xsl:param name="arg" as="xs:string?"/>
3394 2 mingarao
3395 2 mingarao
  <xsl:sequence select="
3396 2 mingarao
     string-join((tokenize($arg,'\s+')[1],
3397 2 mingarao
       for $word in tokenize($arg,'\s+')[position() > 1]
3398 2 mingarao
       return functx:capitalize-first($word))
3399 2 mingarao
      ,'')
3400 2 mingarao
 "/>
3401 2 mingarao
3402 2 mingarao
</xsl:function>
3403 2 mingarao
3404 2 mingarao
3405 2 mingarao
<!--
3406 2 mingarao
  Wraps a sequence of atomic values in XML elements
3407 2 mingarao
3408 2 mingarao
 @author  Priscilla Walmsley, Datypic
3409 2 mingarao
 @version 1.0
3410 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_wrap-values-in-elements.html
3411 2 mingarao
 @param   $values the values to wrap in elements
3412 2 mingarao
 @param   $elementName the name of the elements to construct
3413 2 mingarao
-->
3414 2 mingarao
<xsl:function name="functx:wrap-values-in-elements" as="element()*"
3415 2 mingarao
              xmlns:functx="http://www.functx.com" >
3416 2 mingarao
  <xsl:param name="values" as="xs:anyAtomicType*"/>
3417 2 mingarao
  <xsl:param name="elementName" as="xs:QName"/>
3418 2 mingarao
3419 2 mingarao
   <xsl:for-each select="$values">
3420 2 mingarao
     <xsl:element name="{$elementName}"
3421 2 mingarao
                  namespace="{namespace-uri-from-QName($elementName)}">
3422 2 mingarao
       <xsl:sequence select="."/>
3423 2 mingarao
     </xsl:element>
3424 2 mingarao
   </xsl:for-each>
3425 2 mingarao
3426 2 mingarao
</xsl:function>
3427 2 mingarao
3428 2 mingarao
3429 2 mingarao
<!--
3430 2 mingarao
  Construct a yearMonthDuration from a number of years and months
3431 2 mingarao
3432 2 mingarao
 @author  Priscilla Walmsley, Datypic
3433 2 mingarao
 @version 1.0
3434 2 mingarao
 @see     http://www.xsltfunctions.com/xsl/functx_yearmonthduration.html
3435 2 mingarao
 @param   $years the number of years
3436 2 mingarao
 @param   $months the number of months
3437 2 mingarao
-->
3438 2 mingarao
<xsl:function name="functx:yearMonthDuration" as="xs:yearMonthDuration"
3439 2 mingarao
              xmlns:functx="http://www.functx.com" >
3440 2 mingarao
  <xsl:param name="years" as="xs:decimal?"/>
3441 2 mingarao
  <xsl:param name="months" as="xs:integer?"/>
3442 2 mingarao
3443 2 mingarao
  <xsl:sequence select="
3444 2 mingarao
    (xs:yearMonthDuration('P1M') * functx:if-empty($months,0)) +
3445 2 mingarao
    (xs:yearMonthDuration('P1Y') * functx:if-empty($years,0))
3446 2 mingarao
 "/>
3447 2 mingarao
3448 2 mingarao
</xsl:function>
3449 2 mingarao
3450 2 mingarao
3451 2 mingarao
</xsl:stylesheet>