Funciones XPath/XQuery: de secuencia

www.altova.com Expandir/Contraer todos Imprimir este apartado Página anterior Subir un nivel Página siguiente

Inicio >  Anexos > Funciones XSTL y XPath/XQuery > Funciones de extensión de Altova >

Funciones XPath/XQuery: de secuencia

Las funciones de extensión de Altova para trabajar con secuencias pueden utilizarse en expresiones XPath y XQuery y ofrecen funciones adicionales para el procesamiento de datos.

 

Nota sobre el nombre de las funciones y lenguajes

Puede utilizar todas las funciones de extensión de Altova en sus expresiones XPath/XQuery. Con ellas conseguirá funciones adicionales no disponibles en la biblioteca de funciones estándar de XPath, XQuery y XSLT.

En esta documentación el nombre de las funciones de extensión de Altova siempre termina con el sufijo [altova:] para evitar confundirlas con funciones de la biblioteca estándar. Por ejemplo: add-years-to-date [altova:].
Sin embargo, cuando las utilice en sus expresiones XPath/XQuery, no incluya ningún prefijo o sufijo en el nombre de la función. Por ejemplo: add-years-to-date(xs:date("2014-01-15"), 10).

 

Funciones XPath

(en expresiones XPath en XSLT):

XP1 XP2 XP3.1

Funciones XSLT

(en expresiones XPath en XSLT):

Xslt1 XSLT2 XSLT3

Funciones XQuery

(en expresiones XQuery en XQuery):

XQ1 XQ3.1

 

 

 

Haga clic para expandir/contraerattributes [altova:]

attributes(NombreAtributo as xs:string) como attribute()*     XP3.1 XQ3.1

Devuelve todos los atributos cuyo nombre local coincida con el nombre dado como argumento de entrada (NombreAtributo). La búsqueda tiene en cuenta el uso de mayúsculas y minúsculas y se lleva a cabo en el eje attribute::.

 

attributes("MiAtributo") devuelve MiAtributo()*

 

attributes(NombreAtributo as xs:string, OpcionesBúsqueda as xs:string) como attribute()*     XP3.1 XQ3.1

Devuelve todos los atributos cuyo nombre local coincida con el nombre dado como argumento de entrada (NombreAtributo). La búsqueda tiene en cuenta el uso de mayúsculas y minúsculas y se lleva a cabo en el eje attribute::. El segundo argumento es una cadena con marcas de búsqueda. Estas son las marcas disponibles:

 

r = habilita la búsqueda de expresiones regulares. En este caso, NombreAtributo debe ser una cadena de búsqueda de expresión regular;
i = la búsqueda no tiene en cuenta el uso de mayúsculas y minúsculas;

p = incluye el prefijo de espacio de nombres en la búsqueda. En este caso, NombreAtributo debe contener el prefijo de espacio de nombres (p. ej.: MiAtributo).

 

Las marcas pueden escribirse en cualquier orden y no hace falta utilizar todas. Si usa marcas no válidas, se genera un error. También puede usar una cadena vacía para el segundo argumento. Esto tiene el mismo efecto que usar solo el primer argumento. Sin embargo, no está permitido usar una secuencia vacía.

 

attributes("MiAtributo", "rip") devuelve MiAtributo()*
attributes("MiAtributo", "pri") devuelve MiAtributo()*
attributes("MiAtributo", "") devuelve MiAtributo()*
attributes("MiAtributo", "Rip") devuelve un error de marca desconocida.
attributes("MiAtributo", ) devuelve un error diciendo que falta el segundo argumento.

 

 

Haga clic para expandir/contraerelements [altova:]

elements(NombreElemento as xs:string) como elemento()*     XP3.1 XQ3.1

Devuelve todos los elementos cuyo nombre local coincida con el nombre dado como argumento de entrada (NombreElemento). La búsqueda tiene en cuenta el uso de mayúsculas y minúsculas y se lleva a cabo en el eje child::.

 

elements("MiElemento") devuelve MiElemento()*

 

elements(NombreElemento as xs:string, OpcionesBúsqueda as xs:string) como elemento()*     XP3.1 XQ3.1

Devuelve todos los elementos cuyo nombre local coincida con el nombre dado como argumento de entrada (NombreElemento). La búsqueda tiene en cuenta el uso de mayúsculas y minúsculas y se lleva a cabo en el eje child::. El segundo argumento es una cadena con marcas de búsqueda. Estas son las marcas disponibles:

 

r = habilita la búsqueda de expresiones regulares. En este caso, NombreElemento debe ser una cadena de búsqueda de expresión regular;
i = la búsqueda no tiene en cuenta el uso de mayúsculas y minúsculas;

p = incluye el prefijo de espacio de nombres en la búsqueda. En este caso, NombreElemento debe contener el prefijo de espacio de nombres (p. ej.: MiElemento).

 

Las marcas pueden escribirse en cualquier orden y no hace falta utilizar todas. Si usa marcas no válidas, se genera un error. También puede usar una cadena vacía para el segundo argumento. Esto tiene el mismo efecto que usar solo el primer argumento. Sin embargo, no está permitido usar una secuencia vacía.

 

elements("MiElemento", "rip") devuelve MiElemento()*
elements("MiElemento", "pri") devuelve MiElemento()*
elements("MiElemento", "") devuelve MiElemento()*
elements("MiElemento", "Rip") devuelve un error de marca desconocida.
elements("MiElemento", ) devuelve un error diciendo que falta el segundo argumento.

 

 

Haga clic para expandir/contraerfind-first [altova:]

find-first((Secuencia como item()*)(Condición( Elemento-Secuencia como xs:boolean)) como item()?     XP3.1 XQ3.1

Esta función toma dos argumentos. El primero es una secuencia de uno o varios elementos de cualquier tipo de datos. El segundo argumento, Condición, es una referencia a una función XPath que toma un argumento (es decir, su aridad es 1) y devuelve un valor binario. Cada elemento de Secuencia se envía a su vez a la función a la que se hace referencia en Condición. Nota: recuerde que esta función solo toma un argumento. El primer elemento de Secuencia que consiga que la función de Condicióntrue() como resultado se devuelve como resultado de find-first y la iteración se detiene.

 

find-first(5 to 10, function($a) {$a mod 2 = 0}) devuelve xs:integer 6

El argumento Condición remite a la función inline XPath 3.0 function(), que declara una función inline llamada $a y después la define. Cada elemento del argumento Secuencia de find-first se envía a su vez como valor de entrada a $a. El valor de entrada se prueba en la condición en la definición de función ($a mod 2 = 0). El primer valor de entrada que cumpla la condición se devuelve como resultado de find-first (en este caso 6).

 

find-first((1 to 10), (function($a) {$a+3=7})) devuelve xs:integer 4

 

 

Más ejemplos

Si existe el archivo C:\Temp\Customers.xml:

 

find-first( ("C:\Temp\Customers.xml", "http://www.altova.com/index.html"), (doc-available#1) ) devuelve xs:string C:\Temp\Customers.xml

 

Si no existe el archivo C:\Temp\Customers.xml pero existe http://www.altova.com/index.html:

 

find-first( ("C:\Temp\Customers.xml", "http://www.altova.com/index.html"), (doc-available#1) ) devuelve xs:string http://www.altova.com/index.html

 

Si no existe el archivo C:\Temp\Customers.xml y tampoco existe http://www.altova.com/index.html:

 

find-first( ("C:\Temp\Customers.xml", "http://www.altova.com/index.html"), (doc-available#1) ) no devuelve ningún resultado

 

Notas sobre los ejemplos anteriores

La función XPath 3.0 doc-available toma un solo argumento de cadena, que se usa como URI, y devuelve true si en el URI dado se encuentra un nodo de documento. El documento que está en el URI dado debe ser un documento XML.
La función doc-available se puede usar para Condición, el segundo argumento de find-first, porque solamente toma un argumento (aridad=1), porque toma un item() como entrada (una cadena que se usa como URI) y devuelve un valor binario.
Recuerde que solamente se hace referencia a la función doc-available pero no se le llama. El sufijo #1 que se anexa a la función indica una función cuya aridad es 1. Es decir, doc-available#1 simplemente significa "Utilizar la función doc-availabe() que tiene aridad=1, pasándole como solo argumento a su vez cada uno de los elementos de la primera secuencia." Como resultado, se pasarán las dos cadenas a doc-available(), que utiliza la cadena como URI y prueba si existe un nodo de documento en el URI. Si existe, entonces doc-available() da como resultado true() y esa cadena se devuelve como resultado de la función find-first. Nota sobre la función doc-available(): las rutas de acceso relativas se resuelven en relación al URI base actual, que es por defecto el URI del documento XML desde el que se carga la función.

 

 

Haga clic para expandir/contraerfind-first-combination [altova:]

find-first-combination((Sec-01 como item()*)(Sec-02 como item()*), (Condición( Elem-Sec-01, Elem-Sec-02 como xs:boolean)) como item()*     XP3.1 XQ3.1

Esta función toma tres argumentos:

 

Los dos primeros (Sec-01 y Sec-02) son secuencias de uno o más elementos de cualquier tipo de datos.
El tercero (Condición) es una referencia a una función XPath que toma dos argumentos (su aridad es 2) y devuelve un valor binario.

 

Los elementos de Sec-01 y Sec-02 se pasan en pares ordenados (cada par está formado por un elemento de cada secuencia) como argumentos de la función de Condición. Los pares se ordenan de la siguiente manera:

Si   Sec-01 = X1, X2, X3 ... Xn

Y  Sec-02 = Y1, Y2, Y3 ... Yn

Entonces (X1 Y1), (X1 Y2), (X1 Y3) ... (X1 Yn), (X2 Y1), (X2 Y2) ... (Xn Yn)

 

El primer par ordenado que consiga que la función de Condición dé como resultado true() se devuelve como resultado de find-first-combination. Recuerde que (i) si la función de Condición recorre los pares de argumentos dados y no consigue dar true() como resultado ni una vez, entonces find-first-combination devuelve Sin resultados; (ii) el resultado de find-first-combination siempre será un par de elementos (de cualquier tipo de datos) o ningún elemento.

 

find-first-pair(11 to 20, 21 to 30, function($a, $b) {$a+$b = 32}) devuelve la secuencia de xs:integers (11, 21)
find-first-pair(11 to 20, 21 to 30, function($a, $b) {$a+$b = 33}) devuelve la secuencia de xs:integers (11, 22)
find-first-pair(11 to 20, 21 to 30, function($a, $b) {$a+$b = 34}) devuelve la secuencia de xs:integers (11, 23)

 

Haga clic para expandir/contraerfind-first-pair [altova:]

find-first-pair((Sec-01 como item()*)(Sec-02 como item()*), (Condición( Elem-Sec-01, Elem-Sec-02 como xs:boolean)) como item()*     XP3.1 XQ3.1

Esta función toma tres argumentos:

 

Los dos primeros (Sec-01 y Sec-02) son secuencias de uno o más elementos de cualquier tipo de datos.
El tercero (Condición) es una referencia a una función XPath que toma dos argumentos (su aridad es 2) y devuelve un valor binario.

 

Los elementos de Sec-01 y Sec-02 se pasan en pares ordenados como argumentos de la función de Condición. Los pares se ordenan de la siguiente manera:

Si   Sec-01 = X1, X2, X3 ... Xn

Y  Sec-02 = Y1, Y2, Y3 ... Yn

Entonces (X1 Y1), (X2 Y2), (X3 Y3) ... (Xn Yn)

 

 

El primer par ordenado que consiga que la función de Condición dé como resultado true() se devuelve como resultado de find-first-pair. Recuerde que (i) si la función de Condición recorre los pares de argumentos dados y no consigue dar true() como resultado ni una vez, entonces find-first-pair devuelve Sin resultados; (ii) el resultado de find-first-pair siempre será un par de elementos (de cualquier tipo de datos) o ningún elemento.

 

find-first-pair(11 to 20, 21 to 30, function($a, $b) {$a+$b = 32}) devuelve la secuencia de xs:integers (11, 21)
find-first-pair(11 to 20, 21 to 30, function($a, $b) {$a+$b = 33}) devuelve Sin resultados

 

Observe que en los dos ejemplos anteriores el orden de los pares es: (11, 21) (12, 22) (13, 23)...(20, 30). Por ese motivo el segundo ejemplo no obtiene resultados (porque ningún par ordenado consigue sumar 33).

 

 

Haga clic para expandir/contraerfind-first-pair-pos [altova:]

find-first-pair-pos((Sec-01 como item()*)(Sec-02 como item()*), (Condición( Elem-Sec-01, Elem-Sec-02 como xs:boolean)) como xs:integer     XP3.1 XQ3.1

Esta función toma tres argumentos:

 

Los dos primeros (Sec-01 y Sec-02) son secuencias de uno o más elementos de cualquier tipo de datos.
El tercero (Condición) es una referencia a una función XPath que toma dos argumentos (su aridad es 2) y devuelve un valor binario.

 

Los elementos de Sec-01 y Sec-02 se pasan en pares ordenados como argumentos de la función de Condición. Los pares se ordenan de la siguiente manera:

Si   Sec-01 = X1, X2, X3 ... Xn

Y  Sec-02 = Y1, Y2, Y3 ... Yn

Entonces (X1 Y1), (X2 Y2), (X3 Y3) ... (Xn Yn)

 

La posición de índice del primer par ordenado que consiga que la función de Condición dé como resultado true() se devuelve como resultado de find-first-pair-pos. Recuerde que si la función de Condición recorre los pares de argumentos dados y no da como resultado true() ni una sola vez, entonces find-first-pair-pos devuelve Sin resultados.

 

find-first-pair(11 to 20, 21 to 30, function($a, $b) {$a+$b = 32}) devuelve 1
find-first-pair(11 to 20, 21 to 30, function($a, $b) {$a+$b = 33}) devuelve Sin resultados

 

Observe que en los dos ejemplos anteriores el orden de los pares es: (11, 21) (12, 22) (13, 23)...(20, 30). En el primer ejemplo el primer par consigue que la función de Condición dé como resultado true() y, por tanto, se devuelve la posición de índice que tienen en la secuencia (1). El segundo ejemplo, sin embargo, devuelve Sin resultados porque ningún par consigue sumar 33.

 

 

Haga clic para expandir/contraerfind-first-pos [altova:]

find-first-pos((Secuencia como item()*)(Condición( Elem-Sec como xs:boolean)) como xs:integer     XP3.1 XQ3.1

Esta función toma dos argumentos. El primer argumento es una secuencia de uno o varios elementos de cualquier tipo. El segundo argumento (Condición) es una referencia a una función XPath que toma un argumento (su aridad es 1) y devuelve un valor binario. Cada elemento de Secuencia se envía a su vez a la función a la que se hace referencia en Condición. (Recuerde que esta función toma un solo argumento.) El primer elemento de Secuencia que consiga que la función de Condición dé como resultado true() devuelve la posición de índice que tiene en Secuencia como resultado de find-first-pos y la iteración se detiene.

 

find-first-pos(5 to 10, function($a) {$a mod 2 = 0}) devuelve xs:integer 2

El argumento Condición hace referencia a la función inline XPath 3.0 function(), que declara una función inline llamada $a y después la define. Cada elemento del argumento Sequence de find-first-pos se pasa a su vez como valor de entrada de $a. El valor de entrada se prueba en la condición de la definición de función ($a mod 2 = 0). La posición de índice que tiene en la secuencia el primer valor de entrada que cumple la condición se devuelve como resultado de find-first-pos (en este caso es la posición de índice 2, porque 6 es el primer valor (de la secuencia) que cumple la condición y su posición de índice en la secuencia es 2).

 

find-first-pos((2 to 10), (function($a) {$a+3=7})) devuelve xs:integer 3

 

 

Más ejemplos

Si existe el archivo C:\Temp\Customers.xml:

 

find-first-pos( ("C:\Temp\Customers.xml", "http://www.altova.com/index.html"), (doc-available#1) ) devuelve 1

 

Si no existe el archivo C:\Temp\Customers.xml pero existe http://www.altova.com/index.html:

 

find-first-pos( ("C:\Temp\Customers.xml", "http://www.altova.com/index.html"), (doc-available#1) ) devuelve 2

 

Si no existe el archivo C:\Temp\Customers.xml y tampoco existe http://www.altova.com/index.html:

 

find-first-pos( ("C:\Temp\Customers.xml", "http://www.altova.com/index.html"), (doc-available#1) ) no devuelve ningún resultado

 

Notas sobre los ejemplos anteriores

La función XPath 3.0 doc-available toma un solo argumento de cadena, que se usa como URI, y devuelve true si en el URI dado se encuentra un nodo de documento. El documento que está en el URI dado debe ser un documento XML.
La función doc-available se puede usar para Condición, el segundo argumento de find-first-pos, porque solamente toma un argumento (aridad=1), porque toma un item() como entrada (una cadena que se usa como URI) y devuelve un valor binario.
Recuerde que solamente se hace referencia a la función doc-available pero no se le llama. El sufijo #1 que se anexa a la función indica una función cuya aridad es 1. Es decir, doc-available#1 simplemente significa "Utilizar la función doc-availabe() que tiene aridad=1, pasándole como solo argumento a su vez cada uno de los elementos de la primera secuencia." Como resultado, se pasarán las dos cadenas a doc-available(), que utiliza la cadena como URI y prueba si existe un nodo de documento en el URI. Si existe, entonces doc-available() da como resultado true() y esa cadena se devuelve como resultado de la función find-first-pos. Nota sobre la función doc-available(): las rutas de acceso relativas se resuelven en relación al URI base actual, que es por defecto el URI del documento XML desde el que se carga la función.

 

 

Click to expand/collapsefor-each-attribute-pair [altova:]

for-each-attribute-pair(Seq1 as element()?Seq2 as element()?, Function as function()) como item()*     XP3.1 XQ3.1

Los primeros dos argumentos identifican dos elementos cuyos atributos se usan para construir pares de atributos donde uno de los atributos del par se obtiene del primer elemento y el otro atributo del segundo elemento. Los pares de atributos se seleccionan basándose en que tienen el mismo nombre y se ordenan alfabéticamente por grupos. Si un atributo no tiene un atributo correspondiente en el otro elemento, entonces el par está "desarticulado", lo que significa que tiene un solo miembro. El elemento de la función (tercer argumento Function) se aplica por separado a cada par de la secuencia de pares (articulados y desarticulados) y el resultado es una secuencia de elementos.

 

hmtoggle_plus0Ejemplos
for-each-attribute-pair(/Example/Test-A, /Example/Test-B, function($a, $b){$a+b}) devuelve...

 

  (2, 4, 6) si

   <Test-A att1="1" att2="2" att3="3" />

   <Test-B att1="1" att2="2" att3="3" />

 

  (2, 4, 6) si

   <Test-A att2="2" att1="1" att3="3" />

   <Test-B att3="3" att2="2" att1="1" />

 

  (2, 6) si

   <Test-A att4="4" att1="1" att3="3" />

   <Test-B att3="3" att2="2" att1="1" />

 

    Nota: El resultado (2, 6) se obtiene mediante la siguiente acción: (1+1, ()+2, 3+3, 4+()). Si uno de los operandos es la secuencia vacía, como en el caso de los elementos 2 y 4, entonces el resultado de la suma es una secuencia vacía.

 

for-each-attribute-pair(/Example/Test-A, /Example/Test-B, concat#2) devuelve...

 

  (11, 22, 33) si

   <Test-A att1="1" att2="2" att3="3" />

   <Test-B att1="1" att2="2" att3="3" />

 

  (11, 2, 33, 4) si

   <Test-A att4="4" att1="1" att3="3" />

   <Test-B att3="3" att2="2" att1="1" />

 

 

Haga clic para expandir/contraerfor-each-combination [altova:]

for-each-combination(PrimeraSecuencia as item()*SegundaSecuencia as item()*función($i,$j){$i || $j} ) como item()*     XP3.1 XQ3.1

Los elementos de las dos secuencias en los primeros dos argumentos se combinan de forma que el primer elemento de la primera secuencia se combina, en orden, una vez con cada elemento de la segunda secuencia. La función dada como tercer argumento se aplica a cada una de las combinaciones de la secuencia resultante y da como resultado una secuencia de elementos (véase ejemplo).

 

for-each-combination( ('a', 'b', 'c'), ('1', '2', '3'), function($i, $j){$i || $j} ) devuelve ('a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3')

 

 

Click to expand/collapsefor-each-matching-attribute-pair [altova:]

for-each-matching-attribute-pair(Seq1 as elemento()?Seq2 as elemento()?, Function as función()) como item()*     XP3.1 XQ3.1

Los primeros dos argumentos identifican dos elementos cuyos atributos se usan para construir pares de atributos donde un atributo de cada par se obtiene del primer elemento y el otro atributo del par se obtiene del segundo elemento. Los pares de elementos se seleccionan basándose en que tienen el mismo nombre y se ordenan alfabéticamente por grupos. Si un atributo no tiene un atributo correspondiente en el otro elemento, entonces no se construye ningún par. El elemento de la función (tercer argumento Function) se aplica por separado a cada par de la secuencia de pares (articulados y desarticulados) y el resultado es una secuencia de elementos.

hmtoggle_plus0Ejemplos
for-each-matching-attribute-pair(/Example/Test-A, /Example/Test-B, function($a, $b){$a+b}) devuelve...

 

  (2, 4, 6) if

   <Test-A att1="1" att2="2" att3="3" />

   <Test-B att1="1" att2="2" att3="3" />

 

  (2, 4, 6) if

   <Test-A att2="2" att1="1" att3="3" />

   <Test-B att3="3" att2="2" att1="1" />

 

  (2, 6) if

   <Test-A att4="4" att1="1" att3="3" />

   <Test-B att3="3" att2="2" att3="1" />

 

for-each-matching-attribute-pair(/Example/Test-A, /Example/Test-B, concat#2) devuelve...

 

  (11, 22, 33) if

   <Test-A att1="1" att2="2" att3="3" />

   <Test-B att1="1" att2="2" att3="3" />

 

  (11, 33) if

   <Test-A att4="4" att1="1" att3="3" />

   <Test-B att3="3" att2="2" att1="1" />

 

 

Haga clic para expandir/contraersubstitute-empty [altova:]

substitute-empty(PrimeraSecuencia as item()*SegundaSecuencia as item()) como item()*     XP3.1 XQ3.1

Si PrimeraSecuencia está vacío, la función devuelve SegundaSecuencia. Si PrimeraSecuencia no está vacío, la función devuelve PrimeraSecuencia.

substitute-empty( (1,2,3), (4,5,6) ) devuelve (1,2,3)
substitute-empty( (), (4,5,6) ) devuelve (4,5,6)

 

 

 


© 2019 Altova GmbH