Esquema de un documento XMLEsquema de un documento XML
Los esquemas de BDs restringen que informacioacuten puede ser almacenada
Los documentos XML no requieren tener un esquema asociado
No obstante los esquemas son muy importantes para el intercambio de datos XML
De otro modo un sitio no puede interpretar automaticamente los datos recibidos de otro sitio
Dos mecanismos se usan en XML para especificar esquemas
Document Type Definition (DTD)
Un DTD Impone estructura a un documento XML
XML Schema
Maacutes reciente su uso estaacute en pleno crecimiento
Definicioacuten de Tipo de Documento (DTD)Definicioacuten de Tipo de Documento (DTD)
El tipo de un documento XML puede ser especificado usando un DTD
DTD condiciona o restringe la estructura de los datos XML
Que elementos pueden ocurrir
Que atributos puededebe tener un elemento
Que subelementos puedendeben ocurrir dentro de cada elemento y cuantas veces
DTD no restringe los tipos de datos
Todos los valores se representan como strings en XML
Sintaxis DTD (luego en detalle)
ltELEMENT elemento (especificacioacuten de subelementos) gt ltATTLIST NombreElemento NombreAtributo attType Const gt
Especificacioacuten de Especificacioacuten de ElementosElementos en DTD en DTD La especificacioacuten de un elemento puede contener
Nombres de sub-elementos PCDATA (Parsed Character Data) ie strings de caracteres EMPTY (el elemento no tiene contenido o subelementos) ANY (el contenido puede ser cq Mezcla de PCDATA y elementos) Expresiones regulares
Ejemplolt ELEMENT depositante (nombre clientenuacutemero cuenta)gt
lt ELEMENT nombre cliente (PCDATA)gtlt ELEMENT nuacutemero cuenta (PCDATA)gt
Ejemplo del uso de expresiones regulares
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
A continuacioacuten veremos esto maacutes formalmente
Definicion del tipo de un elementoDefinicion del tipo de un elemento
Un elemento E se declara como
ltELEMENT E Pgt Donde P es una expresioacuten regular ie
P = EMPTY | ANY | PCDATA | Ersquo | P1 P2 | P1 | P2 | P | P+ | P
Ersquo tipo elemento P1 P2 concatenacioacuten P1 | P2 disjuncioacuten P opcional P+ una o maacutes ocurrencias P cero o maacutes ocurrencias (clausura de Kleene)
Nota Clausura de Kleene a b c = ε a b c aa ab ac ba bb bc
1048698Notacioacuten DTDhellip
ldquo|rdquo - alternativas ( e1 | e2 ) especifica que puede aparecer en el documento e1 o e2 (disjuncioacuten)
ldquo+rdquo - 1 o maacutes ocurrencias Un ldquo+rdquo siguiendo al nombre de un elemento significa que el elemento puede aparecer una o maacutes veces en el documento (elemento multivaluado)
ldquordquo - cero o maacutes ocurrencias Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o maacutes veces en el documento (elemento opcionalmente multivaluado)
ldquordquo ndash cero o una ocurrencia Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o una vez en el documento (optional single-valued element)
Todo elemento que aparezca sin ninguno de estos 3 siacutembolos debe aparecer soacutelo una vez en el documento (single-valued element) El tipo de un elemento es especificado entre pareacutentesis siguiendo al elemento Si el pareacutentesis incluye nombres de otros elementos estos seraacuten hijos en la estructura de aacuterbol Si los pareacutentesis incluyen la palabra clave PCDATA el elemento es un nodo hoja Los pareacutentesis pueden anidarse al especificar elementos
Expresiones Regulares ejemplosExpresiones Regulares ejemplos
nombre dir email
nombre
dir
Un ciacuterculo doble denota un estado admisible
Otro ejemploOtro ejemplo
nombredir(tel | fax)email
nombre
dir
tel
tel
fax
fax
Algunas cosas son difiacuteciles de especificarAlgunas cosas son difiacuteciles de especificar
Cada empleado debe contener elementos nombre edad y dni en algun orden
ltELEMENT empleado
( (nombre edad dni) | (edad dni nombre) | (dni nombre edad) |
)gt
Suponga que hay muchos maacutes elementos involucrados
Existen n ordenamientos diferentes para n elementos
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Definicioacuten de Tipo de Documento (DTD)Definicioacuten de Tipo de Documento (DTD)
El tipo de un documento XML puede ser especificado usando un DTD
DTD condiciona o restringe la estructura de los datos XML
Que elementos pueden ocurrir
Que atributos puededebe tener un elemento
Que subelementos puedendeben ocurrir dentro de cada elemento y cuantas veces
DTD no restringe los tipos de datos
Todos los valores se representan como strings en XML
Sintaxis DTD (luego en detalle)
ltELEMENT elemento (especificacioacuten de subelementos) gt ltATTLIST NombreElemento NombreAtributo attType Const gt
Especificacioacuten de Especificacioacuten de ElementosElementos en DTD en DTD La especificacioacuten de un elemento puede contener
Nombres de sub-elementos PCDATA (Parsed Character Data) ie strings de caracteres EMPTY (el elemento no tiene contenido o subelementos) ANY (el contenido puede ser cq Mezcla de PCDATA y elementos) Expresiones regulares
Ejemplolt ELEMENT depositante (nombre clientenuacutemero cuenta)gt
lt ELEMENT nombre cliente (PCDATA)gtlt ELEMENT nuacutemero cuenta (PCDATA)gt
Ejemplo del uso de expresiones regulares
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
A continuacioacuten veremos esto maacutes formalmente
Definicion del tipo de un elementoDefinicion del tipo de un elemento
Un elemento E se declara como
ltELEMENT E Pgt Donde P es una expresioacuten regular ie
P = EMPTY | ANY | PCDATA | Ersquo | P1 P2 | P1 | P2 | P | P+ | P
Ersquo tipo elemento P1 P2 concatenacioacuten P1 | P2 disjuncioacuten P opcional P+ una o maacutes ocurrencias P cero o maacutes ocurrencias (clausura de Kleene)
Nota Clausura de Kleene a b c = ε a b c aa ab ac ba bb bc
1048698Notacioacuten DTDhellip
ldquo|rdquo - alternativas ( e1 | e2 ) especifica que puede aparecer en el documento e1 o e2 (disjuncioacuten)
ldquo+rdquo - 1 o maacutes ocurrencias Un ldquo+rdquo siguiendo al nombre de un elemento significa que el elemento puede aparecer una o maacutes veces en el documento (elemento multivaluado)
ldquordquo - cero o maacutes ocurrencias Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o maacutes veces en el documento (elemento opcionalmente multivaluado)
ldquordquo ndash cero o una ocurrencia Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o una vez en el documento (optional single-valued element)
Todo elemento que aparezca sin ninguno de estos 3 siacutembolos debe aparecer soacutelo una vez en el documento (single-valued element) El tipo de un elemento es especificado entre pareacutentesis siguiendo al elemento Si el pareacutentesis incluye nombres de otros elementos estos seraacuten hijos en la estructura de aacuterbol Si los pareacutentesis incluyen la palabra clave PCDATA el elemento es un nodo hoja Los pareacutentesis pueden anidarse al especificar elementos
Expresiones Regulares ejemplosExpresiones Regulares ejemplos
nombre dir email
nombre
dir
Un ciacuterculo doble denota un estado admisible
Otro ejemploOtro ejemplo
nombredir(tel | fax)email
nombre
dir
tel
tel
fax
fax
Algunas cosas son difiacuteciles de especificarAlgunas cosas son difiacuteciles de especificar
Cada empleado debe contener elementos nombre edad y dni en algun orden
ltELEMENT empleado
( (nombre edad dni) | (edad dni nombre) | (dni nombre edad) |
)gt
Suponga que hay muchos maacutes elementos involucrados
Existen n ordenamientos diferentes para n elementos
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Especificacioacuten de Especificacioacuten de ElementosElementos en DTD en DTD La especificacioacuten de un elemento puede contener
Nombres de sub-elementos PCDATA (Parsed Character Data) ie strings de caracteres EMPTY (el elemento no tiene contenido o subelementos) ANY (el contenido puede ser cq Mezcla de PCDATA y elementos) Expresiones regulares
Ejemplolt ELEMENT depositante (nombre clientenuacutemero cuenta)gt
lt ELEMENT nombre cliente (PCDATA)gtlt ELEMENT nuacutemero cuenta (PCDATA)gt
Ejemplo del uso de expresiones regulares
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
A continuacioacuten veremos esto maacutes formalmente
Definicion del tipo de un elementoDefinicion del tipo de un elemento
Un elemento E se declara como
ltELEMENT E Pgt Donde P es una expresioacuten regular ie
P = EMPTY | ANY | PCDATA | Ersquo | P1 P2 | P1 | P2 | P | P+ | P
Ersquo tipo elemento P1 P2 concatenacioacuten P1 | P2 disjuncioacuten P opcional P+ una o maacutes ocurrencias P cero o maacutes ocurrencias (clausura de Kleene)
Nota Clausura de Kleene a b c = ε a b c aa ab ac ba bb bc
1048698Notacioacuten DTDhellip
ldquo|rdquo - alternativas ( e1 | e2 ) especifica que puede aparecer en el documento e1 o e2 (disjuncioacuten)
ldquo+rdquo - 1 o maacutes ocurrencias Un ldquo+rdquo siguiendo al nombre de un elemento significa que el elemento puede aparecer una o maacutes veces en el documento (elemento multivaluado)
ldquordquo - cero o maacutes ocurrencias Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o maacutes veces en el documento (elemento opcionalmente multivaluado)
ldquordquo ndash cero o una ocurrencia Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o una vez en el documento (optional single-valued element)
Todo elemento que aparezca sin ninguno de estos 3 siacutembolos debe aparecer soacutelo una vez en el documento (single-valued element) El tipo de un elemento es especificado entre pareacutentesis siguiendo al elemento Si el pareacutentesis incluye nombres de otros elementos estos seraacuten hijos en la estructura de aacuterbol Si los pareacutentesis incluyen la palabra clave PCDATA el elemento es un nodo hoja Los pareacutentesis pueden anidarse al especificar elementos
Expresiones Regulares ejemplosExpresiones Regulares ejemplos
nombre dir email
nombre
dir
Un ciacuterculo doble denota un estado admisible
Otro ejemploOtro ejemplo
nombredir(tel | fax)email
nombre
dir
tel
tel
fax
fax
Algunas cosas son difiacuteciles de especificarAlgunas cosas son difiacuteciles de especificar
Cada empleado debe contener elementos nombre edad y dni en algun orden
ltELEMENT empleado
( (nombre edad dni) | (edad dni nombre) | (dni nombre edad) |
)gt
Suponga que hay muchos maacutes elementos involucrados
Existen n ordenamientos diferentes para n elementos
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Definicion del tipo de un elementoDefinicion del tipo de un elemento
Un elemento E se declara como
ltELEMENT E Pgt Donde P es una expresioacuten regular ie
P = EMPTY | ANY | PCDATA | Ersquo | P1 P2 | P1 | P2 | P | P+ | P
Ersquo tipo elemento P1 P2 concatenacioacuten P1 | P2 disjuncioacuten P opcional P+ una o maacutes ocurrencias P cero o maacutes ocurrencias (clausura de Kleene)
Nota Clausura de Kleene a b c = ε a b c aa ab ac ba bb bc
1048698Notacioacuten DTDhellip
ldquo|rdquo - alternativas ( e1 | e2 ) especifica que puede aparecer en el documento e1 o e2 (disjuncioacuten)
ldquo+rdquo - 1 o maacutes ocurrencias Un ldquo+rdquo siguiendo al nombre de un elemento significa que el elemento puede aparecer una o maacutes veces en el documento (elemento multivaluado)
ldquordquo - cero o maacutes ocurrencias Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o maacutes veces en el documento (elemento opcionalmente multivaluado)
ldquordquo ndash cero o una ocurrencia Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o una vez en el documento (optional single-valued element)
Todo elemento que aparezca sin ninguno de estos 3 siacutembolos debe aparecer soacutelo una vez en el documento (single-valued element) El tipo de un elemento es especificado entre pareacutentesis siguiendo al elemento Si el pareacutentesis incluye nombres de otros elementos estos seraacuten hijos en la estructura de aacuterbol Si los pareacutentesis incluyen la palabra clave PCDATA el elemento es un nodo hoja Los pareacutentesis pueden anidarse al especificar elementos
Expresiones Regulares ejemplosExpresiones Regulares ejemplos
nombre dir email
nombre
dir
Un ciacuterculo doble denota un estado admisible
Otro ejemploOtro ejemplo
nombredir(tel | fax)email
nombre
dir
tel
tel
fax
fax
Algunas cosas son difiacuteciles de especificarAlgunas cosas son difiacuteciles de especificar
Cada empleado debe contener elementos nombre edad y dni en algun orden
ltELEMENT empleado
( (nombre edad dni) | (edad dni nombre) | (dni nombre edad) |
)gt
Suponga que hay muchos maacutes elementos involucrados
Existen n ordenamientos diferentes para n elementos
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
1048698Notacioacuten DTDhellip
ldquo|rdquo - alternativas ( e1 | e2 ) especifica que puede aparecer en el documento e1 o e2 (disjuncioacuten)
ldquo+rdquo - 1 o maacutes ocurrencias Un ldquo+rdquo siguiendo al nombre de un elemento significa que el elemento puede aparecer una o maacutes veces en el documento (elemento multivaluado)
ldquordquo - cero o maacutes ocurrencias Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o maacutes veces en el documento (elemento opcionalmente multivaluado)
ldquordquo ndash cero o una ocurrencia Un ldquordquo siguiendo al nombre de un elemento significa que el elemento puede aparecer cero o una vez en el documento (optional single-valued element)
Todo elemento que aparezca sin ninguno de estos 3 siacutembolos debe aparecer soacutelo una vez en el documento (single-valued element) El tipo de un elemento es especificado entre pareacutentesis siguiendo al elemento Si el pareacutentesis incluye nombres de otros elementos estos seraacuten hijos en la estructura de aacuterbol Si los pareacutentesis incluyen la palabra clave PCDATA el elemento es un nodo hoja Los pareacutentesis pueden anidarse al especificar elementos
Expresiones Regulares ejemplosExpresiones Regulares ejemplos
nombre dir email
nombre
dir
Un ciacuterculo doble denota un estado admisible
Otro ejemploOtro ejemplo
nombredir(tel | fax)email
nombre
dir
tel
tel
fax
fax
Algunas cosas son difiacuteciles de especificarAlgunas cosas son difiacuteciles de especificar
Cada empleado debe contener elementos nombre edad y dni en algun orden
ltELEMENT empleado
( (nombre edad dni) | (edad dni nombre) | (dni nombre edad) |
)gt
Suponga que hay muchos maacutes elementos involucrados
Existen n ordenamientos diferentes para n elementos
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Expresiones Regulares ejemplosExpresiones Regulares ejemplos
nombre dir email
nombre
dir
Un ciacuterculo doble denota un estado admisible
Otro ejemploOtro ejemplo
nombredir(tel | fax)email
nombre
dir
tel
tel
fax
fax
Algunas cosas son difiacuteciles de especificarAlgunas cosas son difiacuteciles de especificar
Cada empleado debe contener elementos nombre edad y dni en algun orden
ltELEMENT empleado
( (nombre edad dni) | (edad dni nombre) | (dni nombre edad) |
)gt
Suponga que hay muchos maacutes elementos involucrados
Existen n ordenamientos diferentes para n elementos
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Otro ejemploOtro ejemplo
nombredir(tel | fax)email
nombre
dir
tel
tel
fax
fax
Algunas cosas son difiacuteciles de especificarAlgunas cosas son difiacuteciles de especificar
Cada empleado debe contener elementos nombre edad y dni en algun orden
ltELEMENT empleado
( (nombre edad dni) | (edad dni nombre) | (dni nombre edad) |
)gt
Suponga que hay muchos maacutes elementos involucrados
Existen n ordenamientos diferentes para n elementos
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Algunas cosas son difiacuteciles de especificarAlgunas cosas son difiacuteciles de especificar
Cada empleado debe contener elementos nombre edad y dni en algun orden
ltELEMENT empleado
( (nombre edad dni) | (edad dni nombre) | (dni nombre edad) |
)gt
Suponga que hay muchos maacutes elementos involucrados
Existen n ordenamientos diferentes para n elementos
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ejemplo Banco DTD Ejemplo Banco DTD
ltDOCTYPE banco [
ltELEMENT banco (( cuenta | cliente | depositante)+)gt
ltELEMENT cuenta (numero_cuenta nombre_sucursal balance)gt
lt ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt
lt ELEMENT depositante (nombre_cliente nuacutemero_cuenta)gt
lt ELEMENT nuacutemero_cuenta (PCDATA)gt
lt ELEMENT nombre_sucursal (PCDATA)gt
lt ELEMENT balance(PCDATA)gt
lt ELEMENT nombre_cliente(PCDATA)gt
lt ELEMENT calle_cliente(PCDATA)gt
lt ELEMENT ciudad_cliente(PCDATA)gt
]gt volver
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ejemplo libreta de Direcciones datos XML Ejemplo libreta de Direcciones datos XML
ltpersonagt
ltnombregt Juan Perez ltnombregt
ltpresentacioacutengt Ing J Perez ltpresentacioacutengt
ltdireccioacutengtcalle Las Flores 1234 ltdireccioacutengt
ltdireccioacutengt calle Las Rosas 567 ltdireccioacutengt
lttelgt (321) 786 2543 lttelgt
ltfaxgt (321) 786 2544 ltfaxgt
lttelgt (321) 786 2544 lttelgt
ltemailgt jptutopiacom ltemailgt
ltpersonagt
Teleacutefonos y faxes mezclados
Tantas como se necesiten
Tantas liacuteneas de direccioacuten como sean necesarias
A lo sumo una presentacioacuten
Exactamente un nombre
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
El resto del documento XML para libreta de El resto del documento XML para libreta de direcciones esdirecciones es
ltlibreta-direccionesgt ltpersonagt ltnombregt Juan Perez ltnombregt ltpresentacioacutengt Ing J Perez ltpresentacioacutengt hellip
ltemailgt jptutopiacom ltemailgt ltpersonagt ltpersonagt ltpersonagtlt libreta-direcciones gt
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ej Libreta direcciones especificando la estructura c DTDEj Libreta direcciones especificando la estructura c DTD
nombre para especificar 1 elemento nombre
presentacioacuten para especificar un elemento presentacioacuten opcional (0o1)
Nombre presentacioacuten para especificar 1 nombre seguido de una
presentacioacuten opcional
direccioacuten para especificar 0 o maacutes lineas de direccioacuten
tel | fax un elemento tel o un elemento fax
(tel | fax) 0 o maacutes repeticiones de tel o fax ont n o m xtoc e id i
email 0 or maacutes elementos email
De modo que la estructura completa para persona estaacute dada por la expresioacuten regular
nombre presentacioacuten direccioacuten (tel | fax) email
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Documento XML conDocumento XML con DTD internoDTD interno para libreta de direccionespara libreta de direcciones
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE libreta-direcciones [
ltELEMENT libreta-direcciones (persona)gt
ltELEMENT persona (nombre presentacioacuten direccioacuten (fax | tel) email)gt
ltELEMENT nombre (PCDATA)gt
ltELEMENT presentacioacuten (PCDATA)gt
ltELEMENT direccioacuten (PCDATA)gt
ltELEMENT tel (PCDATA)gt
ltELEMENT fax (PCDATA)gt
ltELEMENT email (PCDATA)gt
]gt
ldquoInternordquo significa que el DTD y el documento XML estaacuten en el mismo archivo
La sintaxis de un DTD no es sintaxis XML
Ampliaremos a continuacioacutenhellip
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Asociando un DTD con un documentoAsociando un DTD con un documento
Un DTD puede ser interno El DTD es parte del archivo del documento
o externo El DTD y el documento estaacuten en archivos separados un DTD
externo puede residir En el sistema de archivos local
(en el que estaacute el documento) En un sistema de archivos remoto
Etiqueta de encabezamientoEtiqueta de encabezamiento
ltxml version=10 standalone=yesno encoding=UTF-8gt Standalone=ldquoyesrdquo significa que se trata de un DTD externo Si se omite el atributo de codificacioacuten el procesador usaraacute UTF-8
(default)
Nota UTF-8 (8-bit Unicode Transformation Format) es un formato de codificacioacuten de caracteres
Unicode de longitud variable
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Con DTD interno
ltxml version=10gt
ltDOCTYPE libreta-direcciones [ltELEMENT gt hellip ]gt
lt libreta-direccionesgt lt libreta-direccionesgt
Con DTD en el sistema de archivos local
ltDOCTYPE libreta-direcciones SYSTEM schemadtdgt
Con DTD en un sistema de archivos remoto
ltDOCTYPE db SYSTEM httpwwwschemaauthoritycomschemadtdgt
Asociando un DTD con un documentoAsociando un DTD con un documento
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Especificacioacuten de Especificacioacuten de AtributosAtributos en DTD en DTD Especificacioacuten de Atributos para catributo de un elemento especificar
Nombre Tipo de atributo
CDATA ID (identificador) o IDREF (ID reference) o IDREFS (muacuteltiples IDREFs)
ndash luego ampliaremos Alguna de las siguientes claacuteusulas
REQUIRED significa que el atributo debe ser incluido en el elemento IMPLIED significa que el atributo es opcional en el elemento FIXED ldquovalorrdquo el valor entre comillas es el uacutenico posible para el atributo ldquovalorrdquo Valor por defecto que toma el atributo si no se daacute ninguno
Ejemplos ltATTLIST cuenta tipodecuenta CDATA ldquocheckingrdquogt ltATTLIST cliente id_cliente ID REQUIRED cuentas IDREFSREQUIREDgt
elemento valor x defecto tipo atributo
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
IDs e IDREFsIDs e IDREFs
Un elemento puede tener a lo sumo un atributo de tipo ID
El valor del atributo ID debe ser distinto para cada elemento del documento XML (valor uacutenico en todo el documento)
Asiacute el valor de un ID es un identificador de objeto
Un atributo de tipo IDREF debe contener el valor de un ID de un elemento del mismo documento
Un atributo del tipo IDREFS contiene un conjunto de (0 o maacutes) valores ID Cada uno de los IDREFS debe contener el valor de un ID de otro elemento del mismo documento
ltpersona id=ldquo898rdquo padre=ldquo332rdquo madre=ldquo336rdquo hijos=ldquo982 984 986rdquogt
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ejemplo banco-2 Ejemplo banco-2 datos XMLdatos XML con ID e IDREF con ID e IDREF
ltbanco-2gtltcuenta nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102nuacutemero_cuenta=ldquoA-401rdquo propietarios=ldquoC100 C102rdquogt
ltnombre_sucursalgt central ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt
hellipltcliente id_cliente=ldquoC100rdquo cuentas=ldquoA-401id_cliente=ldquoC100rdquo cuentas=ldquoA-401rdquogt
ltnombre_clientegt Pepe ltnombre_clientegt ltcalle_clientegt camino ltcalle_clientegt ltciudad_clientegt San Juanltciudad_clientegt
ltclientegt ltcliente id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402id_cliente=ldquoC102rdquo cuentas=ldquoA-401 A402rdquogt
ltnombre_clientegt Mary ltnombre_clientegt ltcalle_clientegt Las piedras ltcalle_clientegt ltciudad_clientegt San Juan ltciudad_clientegt
ltclientegt
hellip ltbanco-2gt
Notar que a diferencia del ej Banco aquiacute no se usa un elemento depositante Lo mismo ocurre si usamos anidamiento (ver a cont ejemplo Banco-1)
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ejemplo Banco-2 Ejemplo Banco-2 DTDDTD
DTD del Banco con atributos ID e IDREF
ltDOCTYPE banco-2[ ltELEMENT banco (( cuenta | cliente)+)gt
ltELEMENT cuenta (sucursal balance)gt ltATTLIST cuenta nuacutemero_cuenta ID REQUIRED
propietarios IDREFS REQUIREDgt ltELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente)gt ltATTLIST cliente
id_cliente ID REQUIRED cuentas IDREFS REQUIREDgt
hellip faltan declaraciones para sucursal balance nombre_cliente calle_cliente y ciudad_cliente]gt
ir DTD del ejemplo Banco
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
ltDOCTYPE pais [ltELEMENT pais ((provinciaciudad))gtltELEMENT provincia (codProvnombreProvcapitalciudades-en)gtltATTLIST provincia idProv ID REQUIREDgtltELEMENT codProv (PCDATA)gtltELEMENT nombreprov (PCDATA)gtltELEMENT capital EMPTYgtltATTLIST capital idrefCiudad IDREF REQUIREDgtltELEMENT ciudades-en EMPTYgtltATTLIST ciudades-en idrefCiudad IDREF REQUIREDgtltELEMENT ciudad (codCiudad nombreCiudaddeprovincia)gtltATTLIST ciudad idCiudad ID REQUIRED gtltELEMENT codCiudad (PCDATA)gtltELEMENT nombreCiudad (PCDATA)gtltELEMENT deprovincia EMPTYgtltATTLIST deprovincia idrefprov IDREF REQUIREDgt ]gt
DTD OtroEjemplohellipDTD OtroEjemplohellip
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
DTDs RecursivosDTDs Recursivos
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona la madre
persona )gt el Padre
]gt
Cual es el problema con esto
Cada persona deberaacute tener padre y madre Esto lleva atener infinitos datos o a queuna persona seadescendiente de si mismo
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
DTDs Recursivos contDTDs Recursivos cont
ltDOCTYPE genealogiacutea [
ltELEMENT genealogiacutea (persona)gt
ltELEMENT persona (
nombre
fechadeNac
persona madre
persona )gt Padre
]gt
Que problema subsiste todaviacutea
No podemos distinguirentre padre y madrePor ejemploSi una persona tiene solamente padre iquest como saber que se trata del padre y no de la madre
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Solucioacuten usando atributos ID e IDREFSolucioacuten usando atributos ID e IDREF
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre)gt
ltELEMENT nombre (PCDATA)gt
ltATTLIST persona id IDREQUIRED
madre IDREFIMPLIED
padre IDREFIMPLIED
hijos IDREFSIMPLIEDgt
]gt
Los IDREFs no tienen tipoLos IDREFs no tienen tipo Los atributos madre y padre son referencias a IDs de otros elementos Sin embargo no seraacuten obligatoriamente elementos persona El atributo madre no necesariamente seraacute una referencia a una
persona del sexo femenino y viceversa para el padre
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltfamiliagt
ltpersona id=ldquolisardquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Lisa Simpson ltnombregt
ltpersonagt
ltpersona id=ldquobartrdquo madre=ldquomargerdquo padre=ldquohomerordquogt
ltnombregt Bart Simpson ltnombregt
ltpersonagt
ltpersona id=ldquomargerdquo hijos=ldquobart lisardquogt
ltnombregt Marge Simpson ltnombregt
ltpersonagt
ltpersona id=ldquohomerordquo hijos=ldquobart lisardquogt
ltnombregt Homero Simpson ltnombregt
ltpersonagt
ltfamiliagt
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Una especificacioacuten alternativa para el DTD del Una especificacioacuten alternativa para el DTD del ejemplo anteriorejemplo anterior
ltxml version=10 encoding=UTF-8gt
ltDOCTYPE familia [
ltELEMENT familia (persona)gt
ltELEMENT persona (nombre madre padre hijos)gt
ltATTLIST persona id ID REQUIREDgt
ltELEMENT nombre (PCDATA)gt
ltELEMENT madre EMPTYgt
ltATTLIST madre m_idref IDREF REQUIREDgt
ltELEMENT padre EMPTYgt
ltATTLIST padre p_idref IDREF REQUIREDgt
ltELEMENT hijos EMPTYgt
ltATTLIST hijos h_idrefs IDREFS REQUIREDgt
]gt
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
ltfamiliagt
ltpersona id=margegt
ltnombregt Marge Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=homerogt
ltnombregt Homero Simpson ltnombregt
lthijos h_idrefs=bart lisagt
ltpersonagt
ltpersona id=bartgt
ltnombregt Bart Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltpersona id=lisagt
ltnombregt Lisa Simpson ltnombregt
ltmadre m_idref=margegt
ltpadre p_idref=homerogt
ltpersonagt
ltfamiliagt
Datos XML compatibles con el DTD anteriorDatos XML compatibles con el DTD anterior
ltELEMENT persona (nombre madre padre hijos)gt helliphellip
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Limitaciones de los DTDsLimitaciones de los DTDs
Tipos de elementos y atributos
Todos los valores son strings no hay enteros reales etc
Dificultad para especificar conjuntos desordenados de subelementos
(A | B) permite especificar un conjunto desordenado pero No puede asegurar que cada A y B ocurra soacutelo una vez
IDs e IDREFs son ldquountypedrdquo
El atributo ldquopropietariordquo de una cuenta puede contener una referencia a otra cuenta lo cual no tiene sentido
El atributo propietario deberiacutea estar restringido para hacer referencia soacutelo a elementos cliente
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Espacio de nombresEspacio de nombres Los datos XML tienen que ser intercambiados entre organizaciones Un mismo nombre de tag puede tener diferentes significados en diferentes
organizaciones causando confusioacuten sobre documentos intercambiados Especificar un string uacutenico como nombre de un elemento evita confusiones La mejor solucioacuten usar nombre-uacuteniconombre-de-elemento Se usa XML Namespaces (espacio de nombres) El espacio de nombres por defecto se declara con el atributo xmlns Los otros espacio de nombres son declarados con xmlnsltsynonymgt
ltbanco XmlnsFB=lsquohttpwwwFirstBankcomrsquogt hellip
ltFBsucursalgt
ltFBnombresucursalgtDowntownltFBnombresucursalgt
ltFBciudadsucursalgt Brooklyn ltFBciudadsucursalgt
ltFBsucursalgthellip
ltbancogt
Veamos esto en maacutes detalle
o alias o prefijo
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Espacio de nombresEspacio de nombresOtro ejemplo de nombres que pueden generar confusioacuten
ltxml version=10 encoding=iso-8859-1gtltdirecciongt ltcallegtAvd Diagonal 8ltcallegt ltciudadgtBarcelonaltciudadgt ltprovinciagtBarcelonaltprovinciagt ltpaisgtEspantildealtpaisgtltdirecciongt
ltxml version=10 encoding=iso-8859-1gtltservidorgt lturlgthttpwwwpalotescomlturlgt ltdirecciongt12345678ltdirecciongtltservidorgt
Los dos documentos XML anteriores tienen en comuacuten el elemento direccion Son dos vocabularios diferentes pero puede ser que en alguacuten momento tengamos que integrarlos en un mismo documento XML Supongamos que juntos ambos documentos nos ofrecen informacioacuten sobre la localizacioacuten de una empresa su direccioacuten fiacutesica y su direccioacuten en Internet Estaacute claro que el elemento direccioacuten va a provocar problemas
Una posible solucioacuten es ponerlo de la siguiente manera
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Espacio de nombresEspacio de nombres
Ej localizacioacuten de una empresa con direccioacuten fiacutesica y direccioacuten en Internet
ltxml version=10 encoding=iso-8859-1gtltempresagt ltnombregtPalotes SAltnombregt ltdirfisdireccion xmlnsdirfis=httpwwwpalotescomdireccionfisicagt ltdirfiscallegtAvd Diagonal 8ltdirfiscallegt ltdirfisciudadgtBarcelonaltdirfisciudadgt ltdirfisprovinciagtBarcelonaltdirfisprovinciagt ltdirfispaisgtEspantildealtdirfispaisgt ltdirfisdirecciongt ltdirservservidor xmlnsdirserv=httpwwwpalotescomdireccionservidorgt ltdirservurlgthttpwwwpalotescomltdirservurlgt ltdirservdirecciongt12345678ltdirservdirecciongt ltdirservservidorgtltempresagt
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Espacio de NombresEspacio de Nombres
capital de un pais ycapital de una transaccioacuten tienendiferentes significados y espacios semaacutenticos (teacutermino geograacutefico vs teacutermino econoacutemico-financiero)
Los espacios de nombres son una solucioacuten a los problemas de homoniacutemia Permiten eliminar ambiguumledades calificando los nombres que se usan en los documentos XML
Veamos un ejemplo en que en un mismo documento apareceriacutean nombres ideacutenticos (pe capital) para elementos diferentes
ltinversionesgt
ltpais nombre=ldquoEspantildeardquogt
ltcapitalgt Madrid ltcapitalgt
ltcapitalgt 200000euro ltcapitalgt
ltpaisgt
ltinversionesgt
Los espacios de nombres permiten combinar en un mismo documento varios vocabularios
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Solucion1Recurrir a una autoridad mundial que asigne nombreshellip complicado
Solucion2Otra solucioacuten es utilizar un mecanismo ya existente por eso se pensoacute en
los URIs (Uniform Resource Identifiers) si bien un URI es una cadena de caracteres que identifica uniacutevocamente un recurso en una red o sistema aquiacute no se trata de utilizar un URI como enlace ni tiene por queacute tener contenido los URI soacutelo se utilizan para que el nombre sea uacutenico Ejemploldquohttpwwwhipertextoinfordquo
Aquiacute definimos un espacio de nombres XML como una coleccioacuten de nombres identificados por una referencia URI que se utiliza en los documentos XML para identificar elementos y atributos
Para definir el espacio de nombres al que pertenece un elemento es necesario antildeadir un atributo a la definicioacuten de dicho elemento donde el nombre del atributo sea xmlns y el valor puede ser una cadena cualquiera aunque por convencioacuten suelen ser URLs
Espacio de NombresEspacio de Nombres
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Solucion2hellip
Asociamos entonces a cada etiqueta un espacio de nombresPara el ejemplo visto usaremos httpwwwbolsacom y httpwwwgeoges
Asi sin ambiguedades el ejemplo queda ltldquohttpwwwbolsaesrdquoinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlns=ldquohttpwwwgeogesrdquogt ltldquohttpwwwgeogcomrdquopaiacutes httpwwwgeogcomrdquonombre =ldquoEspantildeardquogt ltldquohttpwwwgeogcomrdquocapitalgtMadridltldquohttpwwwgeogcomrdquocapitalgt ltldquohttpwwwbolsaesrdquocapitalgt20000euro ltldquohttpwwwbolsaesrdquocapitalgt ltldquohttpwwwgeogcomrdquopaiacutesgt ltldquohttpwwwbolsaesrdquoinversionesgt
Espacio de NombresEspacio de Nombres
Aquiacute no se usaron alias o prefijos
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Solucion3 para no escribir toda la URI se usan alias o prefijos maacutes cortos
xmlnsalias define un alias en el aacutembito de un elemento
Apliquemos esto al ejemplo
ltbolsainversiones
xmlnsbolsa=ldquohttpwwwbolsacomrdquo
xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltbolsacapitalgt 200000 ltbolsacapitalgt
ltgeopaisgt
ltbolsainversionesgt
El alcance de un prefijo de un espacio de nombres comprende desde la etiqueta de inicio de un elemento XML en la que se declara hasta la etiqueta final de dicho elemento XML
Espacio de NombresEspacio de Nombres
bolsa y geo son los alias usados en este ejemplo
Se pueden declarar varios espacios de nombres como atributos de un uacutenico elemento (en este caso del elemento inversiones)
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Solucion3hellip
Idem anterior pero con asignacioacuten dinaacutemica esto es se van asociando
espacios de nombre a los elementos seguacuten van apareciendo
ltbolsainversiones xmlnsbolsa=ldquohttpwwwbolsaesrdquogt
ltgeopaiacutes xmlnsgeo=ldquohttpwwwgeogcomrdquo geonombre=ldquoEspantildeardquogt
ltgeocapitalgtMadridltgeocapitalgt
ltbolsacapitalgt2000euroltbolsacapitalgt
ltgeopaiacutesgt
ltbolsainversiones
Espacio de NombresEspacio de Nombres
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Variante de la solucioacuten 3 usar un espacio de nombres por defecto
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt
ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgt
ltcapitalgt 200000 ltcapitalgt
ltgeopaisgt
ltinversionesgt
En este caso las etiquetas sin prefijo corresponden al espacio de nombres por defecto que es httpwwwbolsacom
Un espacio de nombres por defecto definido en la etiqueta de inicio de un elemento XML se aplica a todos elementos sin prefijo del aacutembito del elemento pero no a los atributos
Espacio de NombresEspacio de Nombres
No tiene prefijo
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Resumiendo
Los espacios de nombres se crearon para evitar las colisiones en los diferentes moacutedulos de software capaces de reconocer las marcaciones del lenguaje XML
Tambieacuten puede ocurrir que aunque los nombres en un documento sean diferentes el software que trabaja con ellos (por ejemplo un buscador) necesite diferenciarlos claramente para darles un tratamiento diferente
Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet aunque esto es recomendable para reducir la posibilidad de que diferentes espacios de nombres usen identificadores iguales Otra motivacioacuten para esta modularidad es que si se dispone de un conjunto de marcaciones para el que ya existe software disponible es mejor la reutilizacioacuten de estas marcaciones que inventar nuevas Asiacute se considera que las construcciones de ciertos documentos deben usar nombres universales cuyo aacutembito se extienda maacutes allaacute del propio documento
Espacio de NombresEspacio de Nombres
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Resumiendohellip
Una de las pruebas del eacutexito del XML es la gran cantidad de vocabularios XML (DTDs) que estaacuten apareciendo En algunas ocasiones al realizar nuestros documentos XML podemos encontrarnos en la necesidad de utilizar varios de estos vocabularios
Por ello aunque un espacio de nombres XML no necesita que su vocabulario esteacute definido es una buena praacutectica usar un DTD o un esquema XML para definir la estructura de datos en la ubicacioacuten URI del espacio de nombres
Por ejemplo es posible que estemos escribendo un artiacuteculo cientiacutefico en formato XML y que tengamos la necesidad de incorporar foacutermulas matemaacuteticas Podemos perfectamente desarrollar nuestras propias etiquetas pero iquestpor queacute no utilizar las que nos proporciona el vocabulario MathML
Espacio de NombresEspacio de Nombres
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Los espacios de nombre nacieron con posterioridad a los DTDsPor eso para validar un documento que usa espacio de nombres es necesario definirlo en el DTD Por ejemplo
ltDOCTYPE inversiones [
ltELEMENT inversiones (geopaiacutes)gt
ltELEMENT geopaiacutes (geocapitalcapital) gt
ltELEMENT geocapital (PCDATA)gt
ltELEMENT capital (PCDATA)gt
ltATTLIST inversiones
xmlns CDATA FIXED httpwwwbolsaes
xmlnsgeo CDATA FIXED httpwwwgeogcomgt
ltATTLIST geopaiacutes
geonombre CDATA REQUIRED gt
]gt
Espacios de Nombres y DTDsEspacios de Nombres y DTDs
ltinversiones xmlns=ldquohttpwwwbolsacomrdquo xmlnsgeo=ldquohttpwwwgeogesrdquogt ltgeopais geonombre=ldquoEspantildeardquogt
ltgeocapitalgt Madrid ltgeocapitalgtltcapitalgt 200000 ltcapitalgt
ltgeopaisgtltinversionesgt
Documento XML
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
XML XML SchSchema vs DTDsema vs DTDs
Un esquema XML es maacutes sofisticado que un DTD y no tiene sus limitaciones soporta
Built-in types
Eg integer string etc
Tambieacuten soporta restricciones de valores minmax
Tipos complejos definidos por el usuario a partir de tipos simples
Un mismo elemento puede tener diferentes tipos dependiendo de donde ese elemento se anida
Restricciones de unicidad y de clave foraacutenea herencia etc
A diferencia de los DTDs los esquemas usan la misma sintaxis de los documentos XML
Mecanismos para integrar espacios de nombres
Representacioacuten maacutes standard pero maacutes complicada
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
XML XML SchSchema vs DTDsema vs DTDs
Al igual que en un DTD el propoacutesito de un esquema XML es definir los bloques de construccioacuten vaacutelidos para un documento XML
Un esquema XML define Elementos que pueden aparecer en un documento Atributos que pueden aparecer en un documento Que elementos son hijos El orden de los elementos hijo El nuacutemero de elementos hijo Si un elemento es vaciacuteo o puede incluir texto Tipos de datos para elementos y atributos Valores por defecto y valores fijos para elementos y atributos
Ventajas sobre los DTDs Los esquemas XML son maacutes ricos y potentes que los DTDs Los esquemas XML son escritos en XML Los esquemas XML soportan tipos de datos Los esquemas XML soportan espacios de nombres (namespaces) Los esquemas XML son extensibles
Se pueden crear nuevos tipos de datos un esquema se puede reusar en otros esquemas se pueden referenciar muacuteltiples esquemas en un documento etc
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
XML XML SchSchemaema otras caracteriacutesticasotras caracteriacutesticas
Elementos y atributos son ldquotipadosrdquo
Elementos que contienen sub-elementos tienen tipo complejo
Elementos con atributos tienen tipo complejo
Los atributos son de tipo simple
los tipos tienen nombre o pueden ser anoacutenimos
Un esquema es definido en un documento esquema-XML
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
ltxml version=10gtltpurchaseOrder orderDate=ldquo2004-10-20gt ltshipTo country=USgt ltnamegtAlice Smithltnamegt ltstreetgt123 Maple Streetltstreetgt ltcitygtMill Valleyltcitygt ltstategtCAltstategt ltzipgt90952ltzipgt ltshipTogt ltbillTo country=USgt ltnamegtRobert Smithltnamegt ltstreetgt8 Oak Avenueltstreetgt ltcitygtOld Townltcitygt ltstategtPAltstategt ltzipgt95819ltzipgt ltbillTogt ltcommentgtHurry my lawn is going wildltcommentgt ltitemsgt ltitem partNum=872-AAgt ltproductNamegtLawnmowerltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt14895ltUSPricegt ltcommentgtConfirm this is electricltcommentgt ltitemgt ltitem partNum=926-AAgt ltproductNamegtBaby MonitorltproductNamegt ltquantitygt1ltquantitygt ltUSPricegt3998ltUSPricegt ltshipDategt2004-12-21ltshipDategt ltitemgt ltitemsgt ltpurchaseOrdergt
documento para elejemplo ldquoorden de comprardquoen archivo lsquopoxmlrsquo
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
ltxsdelement name=purchaseOrder type=PurchaseOrderTypegt
ltxsdelement name=comment type=xsdstringgt
ltxsdcomplexType name=PurchaseOrderTypegt ltxsdsequencegt ltxsdelement name=shipTo type=USAddressgt ltxsdelement name=billTo type=USAddressgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=items type=Itemsgt ltxsdsequencegt ltxsdattribute name=orderDate type=xsddategt ltxsdcomplexTypegt
ltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
documento-esquema para el ejemplo anterios en archivo lsquopoxsdrsquo
xmlschemedocument
(cualquier otro prefijo para el espacio de nombres puede ser usado)
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
ltxsdcomplexType name=Itemsgt ltxsdsequencegt ltxsdelement name=ldquoItem minOccurs=0 maxOccurs=unboundedgt ltxsdcomplexTypegt ltxsdsequencegt ltxsdelement name=productName type=xsdstringgt ltxsdelement name=quantitygt ltxsdsimpleTypegt ltxsdrestriction base=xsdpositiveIntegergt ltxsdmaxExclusive value=100gt ltxsdrestrictiongt ltxsdsimpleTypegt ltxsdelementgt ltxsdelement name=USPrice type=xsddecimalgt ltxsdelement ref=comment minOccurs=0gt ltxsdelement name=shipDate type=xsddate minOccurs=0gt ltxsdsequencegt ltxsdattribute name=partNum type=SKU use=requiredgt ltxsdcomplexTypegt ltxsdelementgt ltxsdsequencegt ltxsdcomplexTypegt
lt-- Stock Keeping Unit a code for identifying products --gt ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
ltxsdschemagt
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
bullespacio de nombres del esquema ltxsdschema xmlnsxsd=httpwwww3org2001XMLSchemagt
bullannotation brinda informacioacuten a lectores humanos ltxsdannotationgt ltxsddocumentation xmllang=engt Purchase order schema for Examplecom Copyright 2000 Examplecom All rights reserved ltxsddocumentationgt ltxsdannotationgt
bull ejemplo de tipo complejoltxsdcomplexType name=USAddressgt ltxsdsequencegt ltxsdelement name=name type=xsdstringgt ltxsdelement name=street type=xsdstringgt ltxsdelement name=city type=xsdstringgt ltxsdelement name=state type=xsdstringgt ltxsdelement name=zip type=xsddecimalgt ltxsdsequencegt ltxsdattribute name=country type=xsdNMTOKENgt ltxsdcomplexTypegt
Este es un elemento XML con 2 subelementos (sequence y attribute) Todos los elementos en el documento que sean del tipo ldquoUSAddressrdquo debe satisfacer esta declaracioacuten de tipo
bull deben tener 5 subelementos en el orden especificadobull deben tener un atributo lsquocountryrsquo
el tipo NMTOKEN soacutelo puede contener letras
diacutegitos punto [ ] guioacuten [ - ] subrayado [ _ ] y dos puntos [ ] Los del tipo
NMTOKENS pueden contener los mismos
caracteres que NMTOKEN maacutes espacios en blanco
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Tipos simples (Built-in )
bullXML simple types ldquostringrdquo ldquobyterdquo ldquointegerrdquo ldquolongrdquo ldquodecimalrdquo ldquofloatrdquo ldquodoublerdquo ldquobooleanrdquo ldquodateTimerdquo ldquoIDrdquo ldquoIDREFrdquo ldquoIDREFSrdquo ldquoanyTyperdquo hellip
ldquoanyTyperdquo es el tipo universal
bull Restricciones sobre los tipos simples
ltxsdsimpleType name=myIntegergt ltxsdrestriction base=xsdintegergt ltxsdminInclusive value=10000gt ltxsdmaxInclusive value=99999gt ltxsdrestrictiongt ltxsdsimpleTypegt
El elemento ldquosimpleTyperdquo tiene un sub-elemento ldquorestrictionrdquo con dos subelementos llamados facetas o facets
ltxsdsimpleType name=SKUgt ltxsdrestriction base=xsdstringgt ltxsdpattern value=d3-[A-Z]2gt ltxsdrestrictiongt ltxsdsimpleTypegt
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ejemplo banco Ejemplo banco datos XMLdatos XML ltbancogt ltcuentagt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_sucursalgt caucete ltnombre_sucursalgt ltbalancegt 500 ltbalancegt
ltcuentagt ltclientegt
ltnombre_clientegt Peacuterez ltnombre_clientegt ltcalle_clientegt el sauce 123 ltcalle_clientegt ltciudad_clientegt angaco ltciudad_clientegt
ltclientegt ltdepositantegt
ltnuacutemero_cuentagt A-101 ltnuacutemero_cuentagt ltnombre_clientegt Peacuterez ltnombre_clientegt
ltdepositantegt
ltbancogt volver
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Documento de un esquema XML ejemplo ldquobancordquoDocumento de un esquema XML ejemplo ldquobancordquo
ltxsschema xmlnsxs=httpwwww3org2001XMLSchemagtltxselement name=ldquobancordquo type=ldquoTipoBancordquogtltxselement name=ldquocuentardquogt
ltxscomplexTypegt ltxssequencegt
ltxselement name=ldquonuacutemero_cuentardquo type=ldquoxsstringrdquogt ltxselement name=ldquonombre_sucursalrdquo type=ldquoxsstringrdquogt ltxselement name=ldquobalancerdquo type=ldquoxsdecimalrdquogt ltxssequencegt ltxscomplexTypegt
ltxselementgthellip falta definicioacuten de cliente y depositante hellipltxscomplexType name=ldquoTipoBancordquogt
ltxssequencegtltxselement ref=ldquocuentardquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquoclienterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogtltxselement ref=ldquodepositanterdquo minOccurs=ldquo0rdquo maxOccurs=ldquounboundedrdquogt
ltxssequencegtltxscomplexTypegtltxsschemagt
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
eleccioacuten del prefijo ldquoxsrdquo cualquier otro prefijo para el espacio de nombres pudo ser elegido
El elemento ldquobancordquo es del tipo ldquoTipoBancordquo que es definido separadamente
xscomplexType es usado despueacutes para crear el tipo complejo ldquoTipoBancordquo (ver ltxscomplexType name=ldquoTipoBancordquogt)
El elemento ldquocuentardquo tiene su tipo (complex) definido ldquoen lineardquo
Documento de un esquema XML ejemplo ldquobancordquo---Documento de un esquema XML ejemplo ldquobancordquo---
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Mas caracteriacutesticas de XML SchemaMas caracteriacutesticas de XML Schema
Etiqueta attribute para especificar atributos xsdattribute name=country type=xsdNMTOKENgt Agregar ldquorequiredrdquo significa que un valor debe ser especificado
Restriccioacuten keykey en el ejemplo banco los ldquonuacutemeros de cuentardquo son ldquola claverdquo para identificar a los elementos cuenta
ltxskey name = ldquoclave_cuentaclave_cuentardquogtltxsselector xpath = ldquobancocuentardquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeygt
Puedo hacer una restriccioacuten ldquoclave_clienterdquo para usar nombre_cliente como clave de cliente
Restriccioacuten keyrefkeyref clave foraacutenea para cuenta en depositanteltxskeyref name = ldquoclave_depositacuentardquo refer=ldquoclave_cuentaclave_cuentardquogt
ltxsselector xpath = ldquobancodepositanterdquogtltxsfield xpath = ldquonuacutemero_cuentardquogt
ltxskeyrefgt Puedo hacer una restriccioacuten similar con refer=ldquoclave_clienterdquo en la clave
foraacutenea para cliente en depositante
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Consultas y Transformacioacuten de datos XMLConsultas y Transformacioacuten de datos XML
TraslacioacutenTraslacioacuten de informacioacutende informacioacuten de un esquema XML a otro
ConsultaConsulta de datos XML (Querying)
Los dos temas estaacuten relacionados y se manejan con las mismas herramientas
Lenguajes estandar de ConsultasTransformacioacuten de datos XML
XPath
Lenguaje simple consistente en expresiones de camino
XQuery
ldquoXML query languagerdquo lenguaje de propoacutesito general para XML
XSLT
Lenguaje disentildeado para transformar documentos XML a XML y XML a HTML
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Aacuterboles como modelo de datos XMLAacuterboles como modelo de datos XML
Los lenguajes de consulta y transformacioacuten estaacuten basados en el modelo aacuterbol de datos XML
Un documento XML es modelado como un aacuterbol con nodos correspondiendo a elementos y atributos
Los nodos Elemento tienen hijos que pueden ser atributos o subelementos
El Texto en un elemento es modelado como un nodo hijo de dicho elemento
Los hijos de un nodo estaacuten ordenados de acuerdo a su orden en el documento XML
Los nodos Elemento y Atributo tienen como padre a otro nodo Elemento (excepto por el nodo raiacutez)
El nodo raiacutez tiene un soacutelo hijo que es el elemento raiacutez del documento
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Modelo de DatosRaiz
CoacutedigoCr
ltEstudiantesgt ltEstudiante StudId=ldquodrrdquogt ltNombregt ltNpilagt Juan ltNpilagt ltApellgt Perez ltApellgt ltNombregt Esp1 ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltCurso Semestre=ldquohelliprdquo CoacutedigoCr=ldquohelliprdquogt ltEstudiantegt ltEstudiantegt hellip ltEstudiantegt ltEstudiantesgt
Raiz
Estudiantes
Semestre
Tipos de Nodos
Documento
Elemento
Texto
atributo
Estudiantes
Curso
EstudianteEstudiante
Nombre
Npila Apell
CursoStudId
CoacutedigoCrldquodr rdquo
ldquoJuanrdquo ldquoPerezrdquo
ldquoEsp1rdquo
SemestreSemestre
ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo ldquohelliprdquo
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
XQueryXQuery
Estandarizado por World Wide Web Consortium (W3C)
Tomado de un libro de texto del 2005 La versioacuten final del estandar puede diferir en algunos aspectos menores
XQuery se deriva del lenguaje Quilt el cual a su vez toma caracteriacutesticas de SQL XQL and XML-QL
XQuery usa la sintaxis for hellip let hellip where hellip order by hellipreturn hellip
for SQL from
where SQL where
order by SQL order by
return SQL select
let permite el uso de variables temporales y no tiene equivalente en SQL
F L W O R(Se pronuncia flower)
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Breve referencia a XpathBreve referencia a Xpath
Expresioacuten coincide (matches) con
bib un elemento bib
cualquier elemento
el elemento raiz
bib un elemento bib bajo la raiz
bibpaper un elemento paper en bib
bibpaper un elemento paper en bib a cq profundidad
paper un elemento paper a cq profundidad
paper|book un elemento paper o un elemento book
price un atributo price
bibbookprice un atributo price en book en bib
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Sintaxis FLWOR en XQuerySintaxis FLWOR en XQuery
La claacuteusula For usa expresiones XPath y la variable en la claacuteusula for asume valores del conjunto retornado por XPath
Expresiones simples en XQuery Encontrar todas las cuentas con balance gt 400 con cada resultado
encerrado entre etiquetas ltaccount_numbergt ltaccount_numbergt
for $x in bancocuenta let $nucta= $x numero_cuenta where $x balance gt 400 return ltaccount_numbergt $nucta ltaccount_numbergt
Los Items en la claacuteusula return son texto XML a menos que esteacuten encerrados entre en cuyo caso son items evaluados
La clausula Let no es realmente necesaria en esta consulta que puede hacerse en Xpath de la siguiente manera
for $x in bancocuenta[balancegt400]return ltnuacutemero_cuentagt $xnumero_cuenta ltnuacutemero_cuentagt
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
XQueryXQuery Constructores Constructores de elementosde elementos
XQuery permite trabajar directamente con estructuras XML Los constructores de elementos permiten embeber estructuras XML
directamente en la programacioacuten con XQuery Por ejemplo lo siguiente es perfectamente vaacutelido en una expresioacuten XQuery
ltbidgt ltitemnogt47ltitemnogt ltuseridgttsmithltuseridgt ltbid_amountgt3425ltbid_amountgt ltbidgt
Sin embargo para poder construir estructuras XML de manera dinaacutemica es necesario usar expresiones XQuery embebidasexpresiones XQuery embebidas en el constructor de un elemento colocando dicha expresioacuten entre llavescolocando dicha expresioacuten entre llaves Esta es la forma maacutes frecuente en que se usan los constructores de elementos en la claacuteusula Return de una expresioacuten FLWOR
ltbidgt ltitemnogt $i ltitemnogt ltuseridgt $u ltuseridgt ltbid_amountgt $a ltbid_amountgt ltbidgt
Cualquier expresioacuten XQuery vaacutelida puede ser embebida lo que significa que los constructores de elementos pueden hacerse tan complejos como se requiera
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
ltltbibbibgtgtltltbookbookgt gt
ltltpublisherpublishergt Addison-Wesley ltgt Addison-Wesley ltpublisherpublishergtgt lt ltauthorauthorgt Serge Abiteboul ltgt Serge Abiteboul ltauthorauthorgtgt lt ltauthorauthorgt gt
ltltfirst-namefirst-namegt Rick ltgt Rick ltfirst-namefirst-namegtgt lt ltlast-namelast-namegt Hull ltgt Hull ltlast-namelast-namegtgt lt ltauthorauthorgtgt lt ltauthorauthorgt Victor Vianu ltgt Victor Vianu ltauthorauthorgtgt lt lttitletitlegt Foundations of Databases ltgt Foundations of Databases lttitletitlegtgt lt ltyearyeargt 1995 ltgt 1995 ltyearyeargtgtltltbookbookgtgtltltbookbook priceprice=ldquo55rdquogt=ldquo55rdquogt lt ltpublisherpublishergt Freeman ltgt Freeman ltpublisherpublishergtgt lt ltauthorauthorgt Jeffrey D Ullman ltgt Jeffrey D Ullman ltauthorauthorgtgt lt lttitletitlegt Principles of Database and Knowledge Base Systemsgt Principles of Database and Knowledge Base Systems ltlttitletitlegtgt lt ltyearyeargt 1998 ltgt 1998 ltyearyeargtgtltltbookbookgtgt
ltltbibbibgtgt
Documento a ser consultado luego con XqueryDocumento a ser consultado luego con Xquery
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
FOR $x$x IN doc(bibxml)bibbibbookbookRETURN ltlibrolibrogt lttiacutetulotiacutetulogt $x $xtitletitletext() lttiacutetulotiacutetulogt ltantildeoantildeogt $x $xyearyeartext() ltantildeoantildeogt ltlibrolibrogt
En Xquery Xquery se puede construir el resultado XML como se desee
ltlibrolibrogt lttiacutetulotiacutetulogt Foundations of DatabasesFoundations of Databases lttiacutetulotiacutetulogt ltantildeogt 19951995 ltantildeogtltlibrolibrogtltlibrolibrogt lttiacutetulotiacutetulogt Principles of Database and Knowledge Base SystemsPrinciples of Database and Knowledge Base Systems lttiacutetulotiacutetulogt ltantildeoantildeogt 19981998 ltantildeoantildeogtltlibrolibrogt
Buscar todos los tiacutetulos de libros y el antildeo en que fueron publicadosBuscar todos los tiacutetulos de libros y el antildeo en que fueron publicados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Xquery Queries AnidadosXquery Queries Anidados Para cada autor de un libro de la editorial Morgan Kaufmann listar
todos los otros libros de ese autor
FOR $b$b IN doc(ldquobibxmlrdquo)bibbib $$a IN $b$bbookbook[publisherpublisher text()=ldquoMorgan Kaufmannrdquo]authorauthorRETURN ltresultadoresultadogt $a$a FOR $t$t IN $b$bbookbook[authorauthortext()=$a$atext()]titletitle RETURN $t$t ltresultadoresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
ltresultadogt ltauthorgtJonesltauthorgt lttitlegt abc lttitlegt lttitlegt lttitlegt ltresultadogt ltresultadogt ltauthorgt Smith ltauthorgt lttitlegt ghi lttitlegt ltresultadogt
XMLXML
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Xquery Queries AnidadosXquery Queries Anidados
El siguiente query convierte datos de la estructura chata de banco (donde cuenta cliente y depositante estaacuten al mismo ldquonivelrdquo) a la estructura anidada de banco-1 (ver diapositiva siguiente)
ltbanco-1gt for $c in bancocliente return
ltclientegt $c for $d in bancodepositante[nombre_cliente = $cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta] return $a
ltclientegt ltbanco-1gt
$c denota todos los hijos del nodo $c sin etiquetas de nivel superior
$ctext() da el contenido texto de un elemento sin etiquetas o subelementos
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Ejemplo banco-1 Ejemplo banco-1 datos XMLdatos XML con anidamiento con anidamiento
ltbanco-1gt ltclientegt
ltnombre_clientegt Huerta ltnombre_clientegt ltdomicilio_clientegt Piedras 2020 ltdomicilio_clientegt ltciudad_clientegt San Juan ltciudad_clientegt ltcuentagt
ltnuacutemero_cuentagt A-102 ltnuacutemero_cuentagt ltnombre_sucursalgt jachal ltnombre_sucursalgt ltbalancegt 400 ltbalancegt
ltcuentagt ltcuentagt hellip hellip hellip ltcuentagt
ltclientegt
ltbanco-1gt
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
XqueryXquery Funcion Funciones es de Agregacioacuten (Aggregate function) de Agregacioacuten (Aggregate function)
Toman una coleccioacuten de valores y entregan un resultado escalar
Buscar todos los libros con maacutes de 3 autores
countcount = funcioacuten para contaravg avg = para calcular promediosumsum = para calcular la sumadistinct-valuesdistinct-values = para eliminar duplicados
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
FOR $x$x IN doc(bibxml)bibbibbookbookWHERE countcount(($x$xauthorauthor)gt3 RETURN $x$x
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
for $a in distinct-valuesdistinct-values(doc(bibxml)author)
return ltautorgt $a ltautorgt
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Buscar libros cuyos precios sean mayores que el promedio
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
ltrespuestagtfor $b in doc(bibxml)bibletlet $a = avg($bbookpricetext())forfor $x in $bbookwhere ($xpricetext() gt $a)return $xltrespuestagt
LETLET liga una variable a un (1) valorFORFOR itera una variable sobre una lista de valores
XqueryXquery FuncioFunciones de Agregacioacutennes de Agregacioacuten
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Xquery FOR vs LETXquery FOR vs LET
ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt ltresultadogt ltbookgtltbookgtltresultadogt
ltresultadogt ltbookgtltbookgt ltbookgtltbookgt ltbookgtltbookgt ltresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
FOR $x$x IN bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con variables nodo iteracioacuten
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
LET $x$x = bibbibbookbookRETURN ltresultadoresultadogt $x$x ltresultadoresultadogt
Liga con 1 variable de coleccioacuten
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Xquery JoinsXquery Joins
Los Joins son especificados de manera similar a SQL
Para el ejemplo banco obtener informacioacuten de clientes y sus cuentas
for $a in bancocuenta $c in bancocliente $d in bancodepositante
where $anuacutemero_cuenta = $dnuacutemero_cuenta and $cnombre_cliente = $dnombre_cliente
return ltcli_cuentagt $c $a ltcli_cuentagt
La misma consulta puede ser expresada con la restriccioacuten expresada como en XPath
for $a in bancocuenta $c in bancocliente
$d in bancodepositante[ nuacutemero_cuenta = $anuacutemero_cuenta and nombre_cliente = $cnombre_cliente] return ltcli_cuentagt $c $a ltcli_cuentagt
Elemde depositante
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
OrdenamientOrdenamiento en XQueryo en XQuery La claacuteusula order by puede ser usada al final de cualquier expresioacuten Por ejemplo
para retornar clientes ordenados por nombre
for $c in bancocliente order by $cnombre_cliente
return ltclientegt $c ltclientegt
Para ordenar en muacuteltiples niveles (por ejemplo ordenar por nombre_cliente y por nuacutemero_cuenta dentro de cada cliente al convertir datos de banco a banco-1)
ltbanco-1gt for $c in bancocliente
order by $cnombre_cliente
return ltclientegt $c
for $d in bancodepositante[nombre_cliente=$cnombre_cliente] $a in bancocuenta[nuacutemero_cuenta=$dnuacutemero_cuenta]
order by $anuacutemero_cuenta
return ltcuentagt $a ltcuentagt
ltclientegt
ltbanco-1gt
Toda los datos XML de los clientes ordenada por nombre de cliente
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Funciones y otras caracteriacutesticas de XQueryFunciones y otras caracteriacutesticas de XQuery Funciones definidas por el usuario con el sistema de tipos de XMLSchema
ejemplo funcioacuten que retorna los balances de las cuentas de un cliente
function balances(xsstring $c) returns list(xsdecimal) for $d in bancodepositante[nombre_cliente= $c] $a in bancocuenta[numero_cuenta= $dnumero_cuenta] return $abalance
Los tipos son opcionales para los paraacutemetros y valores de retorno
El (como en decimal) indica una secuencia de valores de ese tipo
Cuantificador universal y existencial en predicados de la claacuteusula where
some $e in path satisfies P
every $e in path satisfies P
XQuery tambieacuten soporta claacuteusulas If-then-else
for $a in banco-1clientewhere some $c in $acuenta satisfies [balancegt400]returnltclientegt $a ltclientegt
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
Producto(idp nombrep fabricante precio)
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SELECT xnombrep xprecioFROM Producto xORDER BY xprecio
SQL FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
XQuery
Buscar todos los nombres de producto y precios ordenados por precio
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Resultado XQuery paraResultado XQuery para
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogt
FOR $x$x in doc(ldquodbxmlrdquo)dbdbProductoProductorowrowORDER BY $x$xpreciopreciotext()RETURN ltresultadoresultadogt $xnombrepnombrep $xprecioprecio ltresultadoresultadogtXQuery
Buscar todos los nombres de producto y precios ordenados por precio
ltresultadogtltresultadogt ltnombrepgt ltnombrepgt abc ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 7 ltpreciogt ltpreciogtltresultadogtltresultadogtltresultadogtltresultadogt ltnombrepgt ltnombrepgt def ltnombrepgt ltnombrepgt ltpreciogt ltpreciogt 12 ltpreciogt ltpreciogtltresultadogtltresultadogt
Notar que esto no es undocumento bien formado
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Documento bien formado para el ejemplo anteriorDocumento bien formado para el ejemplo anterior
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt for $x in doc(ldquodbxmlrdquo)dbProductorow $x in doc(ldquodbxmlrdquo)dbProductorow order by $xpreciotext() order by $xpreciotext() return ltresultadogt return ltresultadogt $xnombrep $xprecio $xnombrep $xprecio ltresultadogt ltresultadogt ltmiconsultagt
ltmiconsultagt ltresultadogt ltnombrepgt abc ltnombrepgt ltpreciogt 7 ltpreciogt ltresultadogt ltresultadogt ltnombrepgt def ltnombrepgt ltpreciogt 12 ltpreciogt ltresultadogt
ltmiconsultagt
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Compantildeias con al menos 30 productos y el precio promedio
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
SELECT ynombre avg(xprecio)FROM Producto x Compantildeia yWHERE xfabricante=yidcGROUP BY yidceHAVING count() gt 30
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
FOR $r$r in doc(ldquodbxmlrdquo)dbdb $y$y in $r$rCompantildeiaCompantildeiarowrowLET $p$p = $r$rProductoProductororow[fabricantefabricantetext()=$y$yidcidctext()]WHERE countcount($p$p) gt 30RETURN lttheCompanygt ltcompanyNamegt $y$ynombrenombretext() ltcompanyNamegt ltavgPricegt avgavg($p$ppreciopreciotext()) ltavgPricegt lttheCompanygt
collection
element
SQL y XQuery ldquolado a ladordquoSQL y XQuery ldquolado a ladordquo
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
AlmaceAlmacenamnamiento de datos XMLiento de datos XML Almacenes no relacionales
Archivos planos Dado que XML es un formato de archivo es natural almacenar
datos XML como un archivo plano Amplia disponibilidad de herramientas para el acceso y consulta a
archivos XML puede ser suficiente para algunas aplicaciones Presentan los problemas asociados a la gestioacuten de ficheros falta
de concurrencia comprobaciones de integridad atomicidad recuperacioacuten seguridad hellip
Base de Datos XML (pocos sistemas a nivel comercial) Construidas especiacuteficamente para almacenar datos XML soportan
consultas declarativas Usan XML como Modelo de almacenamiento Definen un modelo de datos loacutegico (como DOM) para la estructura
jeraacuterquica de los documentos xml Se almacenan de alguna de las siguientes formas
ndash Traduciendo el DOM a tablas relacionalesndash Traduciendo el DOM a objetos en una BDOOndash Utilizando un almaceacuten creado especialmente con esta finalidad
Bases de datos Relacionales Los datos deben ser traducidos a la forma relacional
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Ventajas
DBMSs maduros y ampliamente usados Posibilidad de utilizacioacuten desde aplicaciones existentes
Desventajas
Sobrecarga en la traduccioacuten de datos y en las consultas
Si XML no se genera a partir de un esquema relacional la transformacioacuten no es tan sencilla Se producen problemas en la conversioacuten especialmente con
ndash Elementos anidadosndash Elementos que se repiten (atributos multivaluados)
Hay tres alternativas de almacenamientoRepresentacioacuten de XML como StringRepresentacioacuten de XML como String Representacioacuten de XML como aacuterbolRepresentacioacuten de XML como aacuterbol Mapeo a relacionesMapeo a relaciones
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Almacenamiento de datos XML en BD RelacionalesAlmacenamiento de datos XML en BD Relacionales
Almacenamiento de XML como String
Se almacena cada elemento hijo del elemento de nivel superior como unatupla aparte con un campo de tipo string de una uacutenica relacioacuten en la BD
Ejemplo utilizar una uacutenica relacioacuten (ELEMENTOS) con un atributo (datos) donde cada tupla almacena un elemento XML en forma de cadena sean esos elementos cuenta cliente o depositante
Mejoras Almacenar cada elemento de nivel superior como una relacioacuten
separada Por ejemplo Tres relaciones cuenta cliente depositante
Indexacioacuten
Valores de subelementosatributos se usan como campos de indexacioacuten para construir iacutendices
Ej Nombre_cliente o nuacutemero_cuenta
Antildeadir atributos a las relaciones que identifiquen cada elemento Algunos sistemas de BD soportan funciones de iacutendices estos sistemas usan el resultado de una funcioacuten como valores de clave
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Representacioacuten String (Cont)Representacioacuten String (Cont)
Beneficios Pueden almacenarse datos XML auacuten sin DTD
Si los elementos de nivel superior del documento tienen gran nuacutemero de hijos los strings seraacuten pequentildeos en comparacioacuten al tamantildeo del documento Esto permite un acceso maacutes raacutepido a los elementos
individuales
Inconvenientes El SGBD NO conoce el esquema de los datos almacenados por
tanto no es posible consultar los datos directamente
Es necesario analizar las cadenas (parsing) para acceder a los valores dentro de los elementos el anaacutelisis es lento
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Representacioacuten aacuterbolRepresentacioacuten aacuterbol
Representacioacuten aacuterbol se modelan los datos XML como un aacuterbol y se almacenan usando las relaciones
nodos (id tipo etiqueta valor) hijo (id_hijo id_padre)
Se inserta una tupla en la relacioacuten nodos para cada elemento y atributo con los campos
1048698 Id identificador del elemento o atributo
1048698 Tipo especifica si se trata de un elemento o atributo
1048698 Etiqueta con nombre de la etiqueta del elemento o el nombre del atributo
1048698 Valor es el valor literal (valor texto) del elemento o atributo
La relacioacuten hijo almacena el elemento padre de cada elemento o atributo Se puede agregar un atributo maacutes (posicioacuten) a hijo con el orden de cada hijo
banco (id1)
cliente (id2) cuenta (id 5)
nombre_cliente (id3) nuacutemero_cuenta (id7)
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Representacioacuten aacuterbolRepresentacioacuten aacuterbol (Cont)(Cont)
Beneficio Pueden almacenarse datos XML auacuten sin DTD
Inconvenientes
Los Datos son fraccionados en muchas piezas incrementando la sobrecarga de espacio
Auacuten las consultas simples requieren un gran nuacutemero de joins lo cual puede resultar muy lento
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Se crea una relacioacuten para cada tipo de elemento cuyo esquema sea conocido En la relacioacuten se guarda
Un atributo id para almacenar un id uacutenico para cada elemento Todos los atributos del elemento se convierten en atributos de su
relacioacuten
Todos los subelementos que se producen una sola vez se convierten en atributos de la relacioacuten Si el valor del subelemento es texto es almacenado como valor del
atributo en la relacioacuten Para subelementos complejos se almacena el id del subelemento
y el subelemento se almacena en una relacioacuten aparte
Si el subelemento puede aparecer varias veces en el elemento seraacute representado en una tabla separada Similar a la forma en que se manejan los atributos multivaluados
cuando se convierte un diagrama E-R a tablas
Un atributo id_padre para mantener el camino al elemento padre Informacioacuten de posicioacuten (ith hijo) puede ser almacenada tambieacuten
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Beneficios
Almacenamiento eficiente
Poder realizar consultas en SQL de manera eficiente y despueacutes trasladar los resultados de SQL de vuelta a XML
Inconvenientes
Se necesita conocer DTD o esquema XML
Las sobrecargas por transformacioacuten continuacutean presentes
Procesos de conversioacuten de datos XML a relaciones y viceversaProcesos de conversioacuten de datos XML a relaciones y viceversa Publishing proceso de convertir datos relacionales al formato XML
Shredding proceso de convertir un documento XML en un conjunto de tuplas a ser insertadas en una o maacutes relaciones
Existen DBMSs que brindan publishing and shredding automatizado
Algunos sistemas ofrecen almacenamiento nativo de datos XML y agregan estructuras internas ldquoespecialesrdquo de datos e iacutendices para mejorar la eficiencia
Mapeo de datos XML a RelacionesMapeo de datos XML a Relaciones
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Representacioacuten en BD relacionalRepresentacioacuten en BD relacional
Una BD relacional de una escuela
student
course
enroll
(inscripto)
cno title credit
331 DB 30350 Web 30hellip hellip hellip
id name gpa
001 J oe 30002 Mary 40hellip hellip hellip
id cno
001 331001 350002 331hellip hellip
grade point average
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Representacioacuten XMLRepresentacioacuten XMLltschoolgt
ltstudent id=ldquo001rdquogt ltnamegt Joe ltnamegt ltgpagt 30 ltgpagt
ltstudentgtltstudent id=ldquo002rdquogt
ltnamegt Mary ltnamegt ltgpagt 40 ltgpagtltstudentgtltcourse cno=ldquo331rdquogt
lttitlegt DB lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltcourse cno=ldquo350rdquogt
lttitlegt Web lttitlegt ltcreditgt 30 ltcreditgtltcoursegtltenrollgt
ltidgt 001 ltidgt ltcnogt 331 ltcnogtltenrollgtltenrollgt
ltidgt 001 ltidgt ltcnogt 350 ltcnogtltenrollgtltenrollgt
ltidgt 002 ltidgt ltcnogt 331 ltcnogtltenrollgt
ltschoolgt
grade point average
inscripto
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
XXSLSLTT
Un stylesheet guarda opciones de formato para un documento usulmente en forma separada del documento
Ej Una hoja de estilo HTML puede especificar color de la fuente y tamantildeo para encabezados etc
El XML Stylesheet Language (XSL) fue disentildeado originalmente para
generar HTML desde XML
XSLT es un lenguaje de transformacioacuten de propoacutesito general Puede transformar XML a XML y XML a HTML
Las transformaciones XSLT son expresadas usando reglas llamadas templates (plantillas)
Los Templates combinan seleccioacuten usando XPath con construccioacuten de resultados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
XSLT TemplatesXSLT Templates Ejemplo de plantillas XSLT con match y select
ltxsltemplate match=ldquobanco-2clienterdquogt ltxslvalue-of select=ldquonombre_clienterdquogt
ltxsltemplategt ltxsltemplate match=ldquordquogt
El atributo de match de xsltemplate specifica un patroacuten XPath Los elementos del documento XML que ldquohagan matchrdquo con el patroacuten son
procesados con las acciones definidas dentro del elemento xsltemplate xslvalue-of selecciona valores de salida (en este caso nombre_cliente)
Para los elementos que no coinciden con ninguna plantilla
El contenido (Atributos y texto) son emitidos como son
Los Templates son aplicados recursivamente a los subelementos La plantilla ltxsltemplate match=ldquordquogt haraacute match con todos los elementos
que no coincidan con ninguna otra plantilla Cuando se usa esos elementos no generan ninguna salida
Si un elemento ldquohace matchrdquo con varias plantillas soacutelo una de ellas es usada en base a un esquema de prioridad definido por el usuario
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Creando salidas XMLCreando salidas XML
Cualquier texto o etiqueta en XSL stylesheet que no esteacute en el xsl namespace va a la salida tal cual es
Ej Envolver resultados en nuevos elementos XML
ltxsltemplate match=ldquobanco-2clienterdquogt
ltclientegt
ltxslvalue-of select=ldquonombre_clienterdquogt
ltclientegt
ltxsltemplategt
ltxsltemplate match=ldquordquogt
Salida
ltclientegt Pepe ltclientegt ltclientegt Mary ltclientegt
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Creando salidas XMLCreando salidas XML (Cont(Cont)) Nota No se puede usar xslvalue-of tag dentro de otra etiqueta
Ej No se puede crear un atributo para ltclientegt en el ejemplo previo usando directamente xslvalue-of
XSLT provee una construccioacuten xslattribute para manejar esta situacioacuten
xslattribute agrega un atributo al elemento precedente
Ej ltclientegt
ltxslattribute name=ldquoid_cliente=rdquogt
ltxslvalue-of select = ldquoid_clienterdquogt
ltxslattributegt
ltclientegt
esto resulta en una salida de la forma
ltcliente id_cliente=ldquohelliprdquogt hellip
xslelement es usado para crear elementos de salida con nombres computados
Top Related