Como en casi todos los lenguajes de programación, XQuery tiene funciones predefinidas. En muchos casos, estas funciones coinciden con XPath.
XQuery 1.0, XPath 2.0 y XSLT 2.0 son los mismos operadores y funciones. Incluyen: matemática, texto de cuerda (cadena), comparaciones de fecha y hora, administración y transformación de nodos XML, y más. Además, tiene bibliotecas predefinidas, y XQuery también le permite crear funciones creadas por el usuario. La llamada a la función puede aparecer en cualquier declaración o como sustituto. El espacio de nombres de la función comenzará con 'fn:', no estoy escribiendo en absoluto. Veamos algunas de las funciones predefinidas.
15 Ejemplo:
Para cada elemento <organization> <members> Reembolso del número de artículos. La respuesta será una lista de números.
for $organizaciones in doc('mondial')/mondial/organization
return count($organizaciones/members)
16 Ejemplo:
Se da el valor promedio de los valores obtenidos en el ejemplo anterior. Para este propósito, se usa la función predefinida avg (minúscula) y la expresión del ejemplo anterior se escribe entre paréntesis.
avg(
for $organizaciones in doc('mondial')/mondial/organization
return count($organizaciones/members)
)
Las funciones también se pueden combinar, como en el siguiente ejemplo: en este caso, el resultado del promedio anterior se redondea a dos decimales usando la función round-half-to-even ():
round-half-to-even (
avg(
for $organizaciones in doc('mondial')/mondial/organization
return count($organizaciones/members)
)
)
17 Ejemplo:
for $agua in doc('mondial') /mondial/sea | /mondial/lake❶
let $nombre:= normalize-space($agua/@name), $tipo:= $lago/name()❷
order by $nombre ❸
return <agua mota='{$tipo}'>{$nombre}</agua>❹
❶$agua se declara la variable, factbook.xml se sacan todos los lagos o mares que estén dentro de mondial
❷$nombre se declara la variable, nombre atributuaren balioa duena y $agua bakoitzari dagokiona (sea edo lake). $mota aldagai bat ere deklaratzen da, $agua elementuaren (literalki sea edo lake) elementuaren izena dutena.
❸La lista ($nombre, $tipo) se ordena con el $nombre
❹Finalmnete mota atributu bat duten <ura> elementuen zerrenda bat ematen da. Dagokion $mota-ren balioa izango du, eta dagokion $izena-ren balioa izango duen testu-edukia.Kontuan hartu behar da aldagaietan gordetako balioak agertzeko, aldagaiak kako zuzenekin inguratu behar direla; bestela, aldagaiaren izena literalki agertuko da.
Emaitza:
<agua tipo="sea">Arabian Sea</agua>
<agua tipo="sea">Arctic Ocean</agua>
<agua tipo="lake">Arresee</agua>...
El usuario también puede definir las funciones.
Ejemplo:
Los elementos de función se pueden obtener de tres maneras:
let
$f
:= function($x, $y) { $x
+ $y
}
return
$f(17, 25)
Resultado: 42
let
$f
:= math:pow#2
return
$f(5, 2)
Resultado: 25
let
$f
:= fn:substring(?, 1, 3)
return
(
$f('foo123'),
$f('bar456')
)
Resultado: foo bar
Function items can also be passed as arguments to and returned as results from functions. These so-called Higher-Order Functions like fn:map
and fn:fold-left
are discussed in more depth on their own Wiki page.
Erabiltzaileak sortzen dituenak
21 Ejemplo:
declare function local:rebaja($precio as xs:decimal?,$d as xs:decimal?) asxs:decimal?
{
let $descuento := ($precio * $d) div 100
return ($precio - $descuento)
};
Ejemplo del uso de la función:
for $libro in doc("libreria.xml")//libro
return <rebaja>{local:rebaja($libro/precio,10)}</rebaja>
22 Ejemplo:
Función factorial recursiva
declare function local:fac($n as xs:decimal) as xs:decimal {
if($n < 2) then $n
else $n * local:fac($n - 1)
};
local:fac(xs:decimal(8))
23 Ejemplo:
Ejercicio "factbook" . Los estados que crece en un 10% su población
declare function local:aumento($cantidad as xs:decimal, $porcentaje as xs:decimal) as xs:decimal
{
let $aumento:= $cantidad * (100 +$porcentaje) div 100
return $handitua
};
for $estato in doc("factbook")/mondial/country
let $aumentoPoblacion := local:aumento($estado/@population/data(),10)
return ('Nombre:', $estado/@name/data(), 'poblacion=', $estado/@population/data(),"Aumento porcentaje :", $aumentoPoblacion )