.. _ej-basex: BaseX ===== .. note:: Los ejercicios que se proponen en esta relación no dejan de ser :ref:`ejercicios sobre XQuery ` más o menos sencillos, pensados para manipular las bases de datos cargadas en el gestor. Tomando como referencia los documentos |XML| diseñados en los :ref:`ejercicios sobre lenguajes de marcas `, resuelva lo siguiente: #. En el ejercicio sobre facturas: .. rst-class:: simple a. Cámbiele el nombre a "*Mariquilla de la O*" por "*María de la O*". .. rst-class:: sol-oculta .. code-block:: xquery replace value of node //cliente[nombre="Mariquilla de la O"]/nombre with "María de la O" #. Añada al final de todos los clientes un elemento que sea ````. .. rst-class:: sol-oculta .. code-block:: xquery for $cliente in //cliente return insert node into $cliente #. Elimine todos los elementos que acaba de añadir, .. rst-class:: sol-oculta .. code-block:: xquery delete node //cliente/solvente #. Cambie al cliente "c01" su identificar por "C01". Recuerde que debería también hacer el cambio de identificador en las facturas a su nombre. .. rst-class:: sol-oculta .. code-block:: xquery for $attr in //@*[. = "c01"] return replace node $attr with attribute {fn:name($attr)} {"C01"} #. Elimine los descuentos de todas las facturas. .. rst-class:: sol-oculta .. code-block:: xquery delete node //factura/@descuento #. Añada a la factura "f01" un descuento del 15%. .. rst-class:: sol-oculta .. code-block:: xquery insert node attribute descuento {15} into //factura[@codigo="f01"] #. Aumente en +5% el descuento a todas las facturas. .. rst-class:: sol-oculta .. code-block:: xquery for $descuento in //factura/@descuento return replace node $descuento with attribute {name($descuento)} {$descuento + 5} #. Elimine de todas las facturas las líneas de facturas por debajo de la segunda, es decir, todas las facturas deben quedar como mucho con dos líneas de factura (*ítems*). .. rst-class:: sol-oculta .. code-block:: xquery delete node //factura/item[position() > 2] #. Añada un atributo a cada factura llamado "items" que contenga la cantidad de líneas de factura que tiene. .. rst-class:: sol-oculta .. code-block:: xquery for $factura in //factura return insert node attribute items {count($factura/item)} into $factura #. Añada tres atributos a inventario llamados *superreducido*, *reducido* y *normal* cuyo valor sea la cantidad de productos que tienen ese tipo de |IVA|. .. rst-class:: sol-oculta .. code-block:: xquery for $iva in ("normal", "reducido", "superreducido") return insert node attribute {$iva} {count(//inventario/producto[@iva=$iva])} into //inventario #. En el ejercicio **8** sobre concesionarios y clientes: .. rst-class:: simple a. Cambiar la marca del concesionario por "Dacia". .. rst-class:: sol-oculta .. code-block:: xquery replace node /concesionario/@marca with attribute marca {"Dacia"} #. Limite la velocidad máxima a **180**. .. rst-class:: sol-oculta .. code-block:: xquery for $vel in //velmax where $vel > 180 return replace value of node $vel with text {180} #. Añadir un atributo con 10 Km a los coches de "*km0*". .. rst-class:: sol-oculta .. code-block:: xquery for $coche in //coche where $coche/@tipo = "km0" return insert node attribute km {10} into $coche #. Sustituir todos los identificadores de cliente, por su equivalente en mayúsculas (p.e. "c01" pasa a ser "C01"). Por ahora, olvide que esos identificadores también se usan como referencia en el atributo *reservado* y que, en consecuencia, también deberían cambiar. .. rst-class:: sol-oculta .. code-block:: xquery for $cliente in //cliente let $id := $cliente/@id return replace node $id with attribute cliente {fn:upper-case($id)}, #. Repite el ejercicio anterior, pero sin olvidar los atributos *reservado*. .. rst-class:: sol-oculta .. code-block:: xquery for $cliente in //cliente let $id := $cliente/@id return ( replace node $id with attribute cliente {fn:upper-case($id)}, for $reservado in //coche/@reservado[. = $id] return replace node $reservado with attribute reservado {fn:upper-case($reservado)} ) #. Añada un modelo "Mezcladito" que sea como el "Ibiza" pero con la cilindrada y la velocidad máxima del "León". .. rst-class:: sol-oculta .. code-block:: xquery copy $mezcladito := //modelo[@nombre = "Ibiza"] modify ( replace value of node $mezcladito/@nombre with "Mezcladito", replace value of node $mezcladito/@id with text {fn:generate-id()}, replace value of node $mezcladito/cilindrada with text {//modelo[@nombre ="León"]/cilindrada}, replace value of node $mezcladito/velmax with text {//modelo[@nombre ="León"]/velmax} ) return insert node $mezcladito after //modelo[last()] #. Convertir el número de plazas en un atributo del elemento modelo. .. rst-class:: sol-oculta .. code-block:: xquery for $modelo in //modelo return ( insert node attribute plazas {$modelo/plazas} into $modelo, delete node $modelo/plazas ) #. Intercambiar el orden de DNI y nombre. .. rst-class:: sol-oculta .. code-block:: xquery for $cliente in //cliente return (: Como es sencillo se podría recrear el elemento dni sin necesidad de copiarlo :) copy $dni_c := $cliente/dni modify () return ( delete node $cliente/dni, insert node $dni_c after $cliente/nombre ) #. Convertir el elemento ```` de la dirección en un atributo de ````. .. rst-class:: sol-oculta .. code-block:: xquery for $direccion in //direccion return ( insert node attribute cp {$direccion/cp} into $direccion/poblacion, delete node $direccion/cp ) #. Mover los coches reservados por un cliente al final del elemento cliente correspondiente y eliminar de ellos el atributo que identifica al comprador ya que no deja de ser necesario. .. rst-class:: sol-oculta .. code-block:: xquery for $coche in //coche[@reservado][@reservado != "false"] return ( copy $coche_c := $coche modify delete node $coche_c/@reservado return insert node $coche_c into //cliente[@id = $coche/@reservado], delete node $coche ) #. Tomando el |XML| del ejercicio sobre *facturas* genere otro documento |XML| con las siguientes diferencias: + Divida el elemento ``inventario`` en tres grupos (elementos ``grupo``) en cada uno de los cuales deben encontrarse los productos con un mismo tipo de |IVA| (*superreducido*, *reducido*, *normal*). Para identificar el tipo de |IVA| incluya un atributo llamado |IVA|: .. code-block:: xml Como ya no es necesario el atributo *iva* en los elementos *producto*, elimínelo. + Añada las facturas de cada cliente, al final del elemento *cliente* correspondiente y elimine los elementos *factura* originales. Como no ya no será necesarios los atributos *cliente* de cada factura, elimínelos también. .. rst-class:: sol-oculta .. literalinclude:: /99.ejercicios/soluciones/facturas/xquery/facturas-50-03.xq .. |IVA| replace:: :abbr:`IVA (Impuesto sobre el Valor Añadido)`