Un constructor de elemento crea un elemento XML. Si el nombre, atributos y contenido del elemento son todos ellos constantes, el constructor se basa en la notación estándar XML y en este caso se llaman constructores de elementos directos.
Veamos un ejemplo en el que mediante un constructor de elemento directo creamos un elemento <book> que contiene atributos, sub-elementos y texto:
<book isbn=”isbn-0060229357”>
<title>Harold and de Purple Crayon</title> <author>
<first>Crockett</first> <last>Johnson</last> </author>
</book>
En los constructores directos de elementos, podemos incluir expresiones mediante los delimitadores { }. Estas expresiones incluidas son evaluadas y sustituidas por su valor, mientras que el texto externo a estas expresiones incluidas se tratan como literales.
Veamos el siguiente ejemplo de consulta: <example>
<p> Here is a query. </p> <eg> $i//title </eg>
<p> Here is the result of the query. </p> <eg>{ $i//title }</eg>
</example>
La consulta anterior en relacion al elementos XML book visto en el ejemplo anterior generaría la siguiente salida:
<example>
<p> Here is a query. </p> <eg> $i//title </eg>
<p> Here is the result of the query. </p>
<eg><title>Harold and the Purple Crayon</title></eg> </exemple>
Puesto que XQuery utiliza los símbolos de llaves { } para delimitar las expresiones incluidas, en el caso de necesitar, durante la creación de un elemento XML la aparición del literal “{“ o “}” se puede utilizar el par “{{“ o el par “}}” para que XQuery que en este caso se trata del uso del literal y no el delimitador de expresiones.
El resultado de un constructor de elemento es un nuevo nodo elemento, con su propia identidad de nodo. Todos los atributos y nodos descendientes del nodo creado son también nuevos nodos con sus propias identidades, incluso en el caso que estos nuevos nodos sean copias de nodos ya existentes.
La etiqueta de comienzo de un constructor directo de elemento puede contener uno o más atributos. Como en XML, cada atributo es especificado por un nombre y un valor.
En un constructor directo de elemento, el nombre de cada atributo es especificado por un QName constante, y el valor del atributo es especificado por una cadena de caracteres incluidos entre comillas simples o dobles.
De manera idéntica a los constructores de elemento, un valor de atributo puede contener las expresiones incluidas entre los signos { } que serán evaluados y substituidos por su valor durante el proceso de construcción del elemento.
Veamos algunos ejemplos: <shoe size="7"/>
Añadimos el valor 7 al atributo size del elemento shoe, de manera idéntica podemos incluir expresiones anidadas:
<shoe size="{7}"/>
En este ejemplo el valor del atributo size es la cadena de caracteres de longitud cero <shoe size="{()}"/>
Podemos determinar que el valor de los atributos sean una secuencia de valores, en el ejemplo siguiente el valor del atributo ref es la secuencia “[1 5 6 7 9]”
Por último, en este ejemplo el valor del atributo size será la concatenación de la cadena “As big as” con el valor del nodo accedido a través de la expresión de acceso a nodos $hat/@size. <shoe size="As big as {$hat/@size}"/>
La parte de un constructor directo de elemento entre la etiqueta de comienzo y la etiqueta final se llama contenido del elemento constructor. Este contenido puede consistir en caracteres literales de texto, constructores jerarquizados de elemento y expresiones incluidas.
Por lo general, el valor de una expresión incluida puede ser cualquier secuencia de nodos y/o de valores atómicos. Las expresiones incluidas se pueden utilizar en el contenido de un constructor del elemento para obtener a través de la evaluación de la expresión tanto el contenido como los atributos del nodo construido.
Veamos algunos ejemplos: <a>{1}</a>
Se construye un nodo que tiene un elemento hijo, un nodo texto, que contiene el valor “1” <a>{1, 2, 3}</a>
El nodo construido tiene un hijo nodo texto que contiene el valor “ 1 2 3” <c>{1}{2}{3}</c>
El nodo construido tiene un nodo hijo de tipo texto que contiene el valor “123”
<fact>I saw 8 cats.</fact>
El elemento construido tiene un hijo del tipo texto que contiene el valor “I saw 8 cats”. Como ya se ha comentado, podemos incluir expresiones incluidas en la generación de contenido, así, el siguiente ejemplo da como resultado el mismo elemento que el ejemplo anterior, la diferencia es que el valor 8 ha resultado de la evaluación de la expresión incluida “{5 + 3}” en lugar de utilizar el literal
<fact>I saw {5 + 3} cats.</fact>
Por último veamos un ejemplo donde el nodo construido tiene tres nodos hijos, un nodo texto conteniendo “I saw”, un nodo hijo llamado <howmany> el que a su vez tiene un nodo hijo conteniendo el valor “8” y por último otro nodo hijo del tipo texto conteniendo el texto “cats”. <fact>I saw <howmany>{5 + 3}</howmany> cats.</fact>
Cuando se construye un elemento a partir de un constructor directo, pueden aparecer como parte del contenido del elemento los espacios en blanco. En otros casos, las expresiones incluidas y/o elementos jerarquizados solamente se pueden separar por espacios en blanco.
Por ejemplo, en la siguiente expresión, </title> y la etiqueta de inicio <author> están separadas por un carácter salto de carro y cuatro espacios en blanco:
<last>Johnson</last> </author>
</book>
Los espacios en blanco que aparecen en los límites entre las etiquetas y/o las expresiones incluidas, como en el ejemplo anterior, los llamaremos espacios en blanco de límite.
El prólogo contiene un declaración llamada xmlspace que controla si los espacios en blanco de límite son preservados por los constructores de los elementos. Si el xmlspace tiene el valor de “strip” (xmlspace=strip), los espacios en blanco de límite no se consideran significativos y se desprecian, en cambio si el valor de xmlspace es “preserve” (xmlspace=preserve) los espacios en blanco de límites se consideran significativos y se preservan.
Por último si queremos incluir algún comentario en el bloque de consulta, la manera de hacerlo sería :
(: This is an XQuery comment :) <!-- This is an XML comment -->
De manera que el resultado de evaluar esta consulta XQuery daría como resultado un elemento XML que contendría solamente el comentario XML:
<!-- This is an XML comment -->