1. XPath.
Introduccin
1.1 Qu es y para qu sirve
TodoelprocesamientorealizadoconunficheroXMLestbasadoenlaposibilidaddedireccionaroaccederacadauna delaspartesquelocomponen,demodoquepodamostratarcadaunodeloselementosdeformadiferenciada. EltratamientodelficheroXMLcomienzaporlalocalizacindelmismoalolargodelconjuntodedocumentos [Link],seutilizanlosURI(UnifomResource Identifiers),deloscualeslosURL(UnifomResourceLocators)sonsindudalosmsconocidos. UnavezlocalizadoeldocumentoXML,laformadeseleccionarinformacindentrodelesmedianteelusodeXPath, [Link] referenciaatexto,elementos,atributosycualquierotrainformacincontenidadentrodeunficheroXML. XPathensesunlenguajesofisticadoycomplejo,perodistintodeloslenguajesproceduralesquesolemosusar(C, C++,Basic,Java...).Adems,comocasitodoenelmundodeXML,anestenestadodedesarrollo,porloquenoes fcilencontrarherramientasqueincorporentodassusfuncionalidades. XPathesasuvezlabasesobrelaquesehanespecificadonuevasherramientasqueaprovecharparaeltratamientode [Link],XLinkyXQL(ellenguajequemanejalosdocumentosXML comosideunabasededatossetratase),quetambinestnenestadodedesarrollo,peroquesindudacambiarnel [Link],XPathsirveparadecircmodebeprocesaruna hojadeestiloelcontenidodeunapginaXML,perotambinparapoderponerenlacesocargarenunnavegadorzonas determinadasdeunapginaXML,envezdetodalapgina.
2. El modelo de datos de XPath
2.1. Construccin del rbol de Nodos
UndocumentoXMLesprocesadoporunanalizador(oparser)[Link] conunelementoraz,quesediversificaalolargodeloselementosquecuelgandelyacabaennodoshoja,que contienenslotexto,comentarios,intruccionesdeprocesooinclusoqueestnvacosyslotienenatributos LaformaenqueXPathseleccionapartesdeldocumentoXMLsebasaprecisamenteenlarepresentacinarbreaquese [Link],los"operadores"dequeconstaestelenguajenosrecordarnlaterminologaquese utilizaalahoradehablarderboleseninformtica:raz,hijo,ancestro,descendiente,etc... [Link],yparacadaunose [Link],dichosnodosatributoNOseconsiderancomohijossuyos,sinomsbiencomo etiquetasaadidasalnodoelemento. [Link] [Link]. PginaXML:
<libro> <titulo>Dos por tres calles</titulo> <autor>Josefa Santos</autor> <capitulo num="1"> La primera calle <parrafo> Era una sombria noche del mes de agosto...
</parrafo> <parrafo destacar="si"> Ella, inocente cual <enlace href="[Link] que surca el cielo en busca de libaciones... </parrafo> </capitulo> <capitulo num="2" public="si"> La segunda calle <parrafo>Era una obscura noche del mes de septiembre...</parrafo> <parrafo> Ella, inocente cual <enlace href="[Link] que surca el viento en busca del nectar de las flores... </parrafo> </capitulo> <apendice num="a" public="si"> La tercera calle <parrafo> Era una densa noche del mes de diciembre... </parrafo> <parrafo> Ella, candida cual <enlace href="[Link] que surca el espacio en busca de bichejos para comer... </parrafo> </apendice> </libro>
rbolgenerado:
/ | +---libro | +---titulo | | | +---(texto)Dos por tres calles | +---autor | | | +---(texto)Josefa Santos | +---capitulo [num=1] | | | +---(texto)La primera calle | | | +---parrafo | | | | | +---(texto)Era una sombra noche ... | +---parrafo | | | +---(texto)Ella, cual inocente mariposa... | +---capitulo [num=2] | +---(texto)La segunda calle | +---parrafo | | | +---(texto)Era una obscura noche ... +---parrafo | +---(texto)Ella, cual inocente abeja...
2.2. Tipos de Nodos
ExistendistintostiposdenodosenunrbolgeneradoapartirdeundocumentoXML,asaber:raz,elemento,atributo, texto, comentario e instruccin de procesamiento (respectivamente; root, elements, attribute, text, comment y processinginstruction). Nodo Raz Seidentificapor/.[Link],sieldocumentoXML denuestroejemplotieneporelementorazalibro,steserelprimernodoquecuelguedelnodorazdelrbol,el cuales:/. Insisto: / hacereferenciaalnodorazdelrbol,peronoalelementorazdeldocumento XML,pormsqueun [Link],podemosafirmarqueelnodorazdelrbolcontieneal elementorazdeldocumento. Nodo Elemento [Link] [Link],asuvez,unelemento,exceptoelelementoraz,cuyopadreesel [Link],queson:nodoselemento,nodostexto,nodoscomentarioynodos [Link],susatributose informacinsobrelos"espaciosdenombre"quetieneactivos. [Link] [Link],asuvez,unelemento,exceptoelelementoraz,cuyopadreesel [Link],queson:nodoselemento,nodostexto,nodoscomentarioynodos [Link],susatributose informacinsobrelos"espaciosdenombre"quetieneactivos. Una propiedad interesante de los nodos elemento es que pueden tener identificadores nicos (para ello deben ir acompaadosdeunDTDqueespecifiquedichoatributoyaseguraquetomavaloresnicos),estopermitereferenciara dichoselementosdeunaformamuchomsdirecta. Nodos Texto [Link] nodotextonotienehijos,esdecir,losdistintoscaracteresqueloformannoseconsideranhijossuyos. Nodo Atributo Comoyahemosindicado,losnodoatributonosontantohijosdelnodoelementoqueloscontienecomoetiquetas [Link],unvalor(queessiempreunacadena)yun posible"espaciodenombres". AquellosatributosquetienenporvalorelvalorpordefectoasignadoenelDTDsetratarncomosielvalorsele [Link],nosecreanodoparaatributosnoespecificadosenel documentoXML,yconlapropiedad #IMPLIED definida [Link] [Link] procesarundocumentoXML. Nodos comentario y de instrucciones de proceso Aparte de los nodos indicados, en el rbol tambin se generan nodos para cada nodo con comentarios y con [Link]-value.
3. Los Location Paths
3.1. Conceptos bsicos
Expresiones Una"instruccin"[Link]"instruccin"porque XPathesunlenguajedeclarativo,porloquelasintruccionesnosonexactamentecomoestamosacostumbradosaver. [Link] nos vamos a ceir a dos tipos de operandos: llamadas a funciones y location paths (algo as como caminos de localizacin). Un locationpath [Link] sintaxisdeunlocationpathessimliaralausadaalahoradedescribirlosdirectoriosqueformanunaunidaddediscoen UnixoLinux(ysimilaraladelossistemasbasadosenMSDOSyWindows,siexceptuamoslaunidaddediscoC:, A:yquelasbarrasusadasson/envezdelastpicas\deestosltimossistemasoperativos). Sinembargo,slolasintaxiseslosimilar [Link] diferente. Porejemplo,elsiguientepathenUnix: /usr/home/pepeillo/docs hacereferenciaaunnicodirectorio:docselcualcuelgadeelconjuntodedirectorios/usr/home/pepeillo. Sinembargo,lasiguienteexpresinenXPath: /libro/capitulo/parrafo hacereferenciaaTODOSloselementosparrafoquecuelguendirectamentedeCUALQUIERelementocapitulo quecuelguedeCUALQUIERelementolibroque,finalmente,cuelguendelnodoraz,/.Bueno,elltimo"TODOS" sobradadoquesolopuedehaberunelementoraz:libro. Hayqueteneren cuenta queunaexpresinen XPathnodevuelvelos elementos quecumplencon elpatrnque representadichaexpresin,sinoquedevuelveuna referencia adichoselementos;esdecir,unaexpresinXPathnos [Link] omsnodos. Nodo contexto Un locationpath siempretieneunpuntodepartidallamado [Link] [Link],siestandoenUnix,damosunaordenlsobtendremoslosficheros queexisteneneldirectorioactual,mientrasquesidecimos ls /usr/bin obtendremosellistadodelosficheros existenteseneldirectorio/usr/binconindependenciadeldirectorioenqueestemoscolocadosaldarlaorden. [Link],seentenderqueellocationpath partedelnodoqueencadamomentoseestprocesando. Elconceptode"nodocontexto"esimprescindibleparacomprendercmosellevaacabolaeleccindelosnodosque [Link],veamoscmoactuaraunmotordeevaluacinde expresionesXPathalleerlasiguienteexpresinaplicadaaldocumentoXMLquemanejamosdesdeelprincipiodel turtorial: /libro/capitulo/parrafo (Aviso:loquevieneacontinuacinrequieredepausadalectura,descansitoparairalfrigorficoaporalgodebebery pequeomasajeenlosojos...comomnimo) Enprimerlugarcomienzaporleer/,locualledicequedebeseleccionarelnodoraz,independientementedelnodo
[Link],stepasaaser elnodocontextodedichaexpresin. Siguiendoconnuestroejemplo,elanalizadorleeraahoralibro,locualledicequeseleccioneTODOSloselementos quecuelgandelnodocontexto(queatendiendoalprrafoanterioreselnodoraz)[Link]...en estecasosolohayuno...porque(otravez)solopuedehaberunelementoraz. [Link],locualledicequeseleccione TODOSloselementosquecuelgandelnodocontexto(queatendiendoalprrafoanterioreselnodolibro). Enundiscoseraimposiblequehubieradosdirectoriosconelmismonombrecolgandodeunmismodirectoriopadre. Sinembargo,ennuestrodocumentoXMLpodemosvercomohaydoselementos capitulo colgandodelelemento [Link],enestosmomentoshaydoselementosqueencajanconelpatrn/libro/capitulo. [Link] queseleccioneTODOSloselementosparrafoquecuelgandelnodocontexto...peroNOhayunnodocontexto,sino DOS!!Bueno,nopasanada,cadaunodelosnodosdeeseconjuntodenodosvaatenersumomentodegloria,deforma queelevaluadordeexpresioneslovaarecorrerunoporunohaciendoque,mientrasevalaundeterminadonodo,se seaelnodocontextodeesemomento. Enotraspalabras,paralocalizartodosloselementos parrafotalycomodeseamos,seprocesaelprimerelemento capitulo y de l se extraen todos los parrafo que contenga. A continuacin se pasa al prximo elemento capitulodelcualsevuelvenaextraertodoslosdetipoparrafoquetenga...[Link] esunnuevoconjuntodenodos(oparasermsprecisos,conjuntodepunterosanodo)queencajanconelpatrn buscado. Predicados Porlopocoquellevamosvisto,podemospensarqueXPathesungranmecanismoparaseleccionarmuchosnodosala vez,[Link]?oms deunnodoquecumpleconunpatrnperonotodoslosquelocumplen,sinosoloaquellosconunatributoqueles hemosaadidoparasaberquelospuedevertodoelmundo?Bueno,puesparatodoestoseutilizanlospredicados. Lospredicadosseincluyendentrodeunlocationpathutilizandoloscorchetes,comoporejemplo: /libro/capitulo[@num="1"]/parrafo Mediante el anterior locationpath estamos indicando que se escojan todos los elementos parrafo de todos los elementoscapituloquetenganunatributollamadonumalcualselehayaasignadoelvalor"1"(recordemosqueen XMLtodoslosatributostienenvaloresdetipocadena). Atendiendoanuestroejemplo,solohayuncapituloquecumpladichascondiciones,porloquesololoselementos parrafoquelcontienesernseleccionados. Posteriormente,veremosqutipodecosassepuedenponerenunpredicado.
3.2. Cmo hago los eje mplos?
Buenapregunta. GenerarunficheroXMLesmuysencillo,bastauneditordetextocorrienteymoliente;pero,cmopodemos comprobarqueunaexpresinXPathescorrecta?,esdecir,quetrasejecutarsepodamoscomprobarquedichaexpresin seleccionajustolosnodosquedeseamos. Enrealidad,[Link],muytilescuandodeseamos evaluarexpresionesmuycomplejas,obienusarunahojaXSL. Dehecho,msadelanteestudiaremosunprogramaJavadesarrolladoparaestetutorial,yloutilizaremosparaprobarlos ejemplos. Noobstante,pararealizarlosejemplosyejerciciosessuficientecondisponerdeunnavegadorWebqueseacapazde
mostrardocumentosXMLalosque,asuvez,seaplicaunficheroXSL,estoes,unficheroquerealizatransformaciones enelXMLgenerandounnuevocontenido. Parahacerlofcil,hazlosiguiente: Paso1:[Link].
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="evalua_xpath.xsl"?> <libro> <titulo>Dos por tres calles</titulo> <autor>Josefa Santos</autor> <capitulo num="1"> La primera calle <parrafo> Era una sombra noche del mes de agosto... </parrafo> <parrafo destacar="si"> Ella, inocente cual <enlace href="[Link] que surca el cielo en busca de libaciones... </parrafo> </capitulo> <capitulo num="2" public="si"> La segunda calle <parrafo>Era una obscura noche del mes de septiembre...</parrafo> <parrafo> Ella, inocente cual <enlace href="[Link] que surca el viento en busca del nctar de las flores... </parrafo> </capitulo> <apendice num="a" public="si"> La tercera calle <parrafo> Era una densa noche del mes de diciembre... </parrafo> <parrafo> Ella, cndida cual <enlace href="[Link] que surca el espacio en busca de bichejos para comer... </parrafo> </apendice> </libro>
Comopuedesver,esteficheroXMLincluyeunalneaqueindicaquficheroXSL(elficheroquepermiteevaluar expresionesXPath)vaautilizarseparaseleccionarnodosygenerarlainformacinconlaquerealimentesedesea [Link],evalua_xpath.xslesjustoelqueponemosacontinuacin. Paso2:Guardaelsiguienteficheroconelnombreevalua_xpath.xsl(ojoalaextensin:xsl).
<?xml version="1.0"?> <!-========================================================================== | File..........: evalua_xpath.xsl | Author........: Victor Manuel Rivas Santos, vrivas@[Link] | Description...: XSL for tutorials ========================================================================== -->
<xsl:stylesheet version="1.0" xmlns:xsl="[Link] <xsl:template match="libro"> <HTML> <HEAD> <TITLE>Ejemplos en XPath</TITLE> </HEAD> <BODY> <H1>Resultados:</H1> <PRE> <xsl:apply-templates select="/libro/capitulo/text()"/> </PRE> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
Paso3:ComprobarquetusexpresionesXPathsoncorrectas. Acontinuacin,lonicoquetienesquehaceressustituirloquehemosescritoenrojoenelfichero evalua_xpath.xsl(esdecir,/libro/capitulo)porlaexpresinquequierasevaluaryvolveraguardarel [Link]:nosedebequitar/text(),peroesporquenosvaaservirparapodercomprobarvisualmentequeslose hanseleccionadolosnodosquenosinteresaban;insistimos,laexpresinXPathnonecesitaacabarcon/text(),pero laponemosparaquenosotrosveamosmejorelresultadoenelnavegador. Paraversifunciona,[Link] vercmosevisualizanslolosnodosquehayaselegido. Usando Java Comoalternativa,hemosdesarrolladounprogramaJavaquerecibeeldocumentoXMLaprocesar,ypidequeseteclee [Link].
[Link].*; [Link]; [Link].*; [Link]; [Link]; [Link]; publicclassDemoXPath{ publicDemoXPath(){} publicstaticvoidmain(String[]args){ if([Link]!=1){ [Link]("\nUSO:[Link]\n"); [Link](0); } DemoXPathdemoxpath=newDemoXPath(); try{ [Link]("\nIntroducelaexpresiondebusqueda:"); BufferedReaderstdin=newBufferedReader(newInputStreamReader([Link])); Stringbusqueda=[Link](); XPathxpath=[Link]().newXPath(); DocumentBuilderFactoryfactory=[Link](); DocumentXMLDoc=[Link]().parse(newInputSource(new FileInputStream(args[0]))); Elementelement=[Link](); XPathExpressionexp; exp=[Link](busqueda); [Link]("=>\n"+(String) [Link](element,[Link])+"\n"); }catch(Exceptionex){ [Link]("Error:"+[Link]()); } }//delmain }//deladefinicindeclase
3.3. Hachas?Ejes?
Laverdadesquenosabamuybiencomotraducireltrminoaxesquesignificaalgoascomocercenaropodar,aunque [Link]. Digamosqueun hacha includaenun locationpath realizaunaseleccindenodosdentrodelrbol(omejordicho, dentrodelsubrbolquecuelgadelnodooconjuntodenodoscontexto)[Link],quecada vezquehemosusadolabarra/(salvoparadenominarelnodoraz)estbamosusandounhacha. Veamoslasdistintashachasquepodemosusarpararecorrerelarbolito. Child Es el hacha utilizada por defecto. Se corresponde con la barra, / (aunque tiene una forma ms larga que es: /child::). Ejemplo:Seleccionartodoslostitulodeunlibro: /libro/titulo Ejercicio:Seleccionarelautordellibro. Ejercicio:Seleccionartodoslosprrafosdellibro. Attribute Secorrespondeconelsignodelaarroba,@(oensuformalargaquees:attribute::). Medianteesteoperadorpodemosseleccionaraquellosnodosatributosquedeseemos,indicandoelnombredelatributo encuestin. Ejemplo:Seleccionarelatributonumqueposeanloselementoscapitulo /libro/capitulo/@num
(Paraveresteejemplotendrsquequitar/text()delficheroevalua_xpath.xsl)
Ntese,queparaseleccionarlosnodoselementoquemuestrandichosatributos,loquesehadeusaresunpredicado (comosehaindicadoyaanteriormente)indicandoelnombrequehadeposeerelatributoy,sisedesea,elvalorque debepresentar. Ejemplo:Seleccionartodosloselementoshijodeloscapituloqueposeanelatributopublic(sinimportarel valorasignadoalmismo): /libro/capitulo[@public]/* Ejemplo:Seleccionartodosloselementoshijodeparrafocuyoatributodestacarseaiguala"si". /libro/titulo/parrafo[@destacar="si"] Ejercicio:Seleccionartodosatributosnumdelosapndices. Ejercicio:Seleccionartodoslosatributoshrefdetodoslosprrafosdelfichero. Ejercicio:Seleccionartodoslosprrafosdeloscaptulos(nodelosapndices)queposeanunatributohref Descendant Seespecificaponiendounadoblebarra://(ensuformalarga:descendant::). [Link],nosololoshijos delosnodoscontexto,sinotambinloshijosdeloshijos,yloshijosdeestos,etc.
Ejemplo:Seleccionartodoslosparrafodeunlibro: /libro//parrafo Ejemplo:Seleccionartodoslosdescendientesdeparrafoquetienenunatributohref. //parrafo//*[@href] Ejemplo:Mostrarelvalordelatributohrefdelcasoanterior:. //parrafo//*[@href]/@href Self Seespecificamedianteelpunto(.). [Link],supongamosquedeseamosseleccionartodoslos parrafo descendientes del nodo contexto. No podemos escribir //parrafo, dado que seleccionara todos los [Link],laformacorrectaes:.//parrafo [Link] momentoseverconmsclaridadlagranutilidaddeestehacha. Parent Aligualqueenlossistemasdeficheros,seutilizanlosdospuntosparaidentificarlo:.. Elcomportamientodeestehachaesunpocoextraoalprincipiodadoquerealizaunpasohaciaatrsenelrbolde nodos. Ejemplo:Seleccionartodoslosnodosquetienenalgnhijodetipoparrafo: //parrafo/.. Ejemplo:Seleccionartodoslosnodoscapituloquetienenalgnhijodetipoparrafo: //parrafo/../../capitulo Obien: //capitulo/parrafo/.. Ejercicio:Seleccionartodoslosnodosquetienenunhijodetipoenlace. Ancestor Detodaslashachasquepodemosusar,estaeslanicaquenotieneningunaformadeabreviacin,sinoquehayque ponerlacomoancestor:: [Link],devuelvetodosloselementosdeloscualesel nodocontextoesdescendiente. Ejemplo:Seleccionartodosloselementosquetienenentresusdescendientesalgnparrafo //parrafo/ancestor::*
3.4. Nodos test
Los nodostest sonalgoascomofuncionesquenosvanaayudararestringirunpoquitoloquenosdevuelveuna [Link] msdetenimiento. Enprimerlugarhemosdedistinguirentrelashachasdecontenido(contentaxis)[Link] conteniosonbsicamentetodaslasvistasexceptoattibuteynamespace(escomoattributeperoparaobtener el"espaciodenombres"asociadoalelemento). Nodos test aplicables a TODAS las hachas Elnodotest*devuelvetodoslosnodosdetipoprincipal(esdecir,elemento,atributooespaciodenombres),perono nodosdetexto,comentariosydeinstruccionesdeproceso. Ejemplo:Seleccionartodoslosnodosprincipalesdescendientesdelosparrafo: //parrafo/* Ejercicio:Seleccionartodoslosnodosprincipalesdescendientesdelosapndices: node() Elnodotestnode()devuelvetodoslosnodosdetodoslostipos. Seleccionartodoslosnodosdescendientesdelosparrafo: //parrafo/node() Nodos Test aplicables SOLO a la hachas de contenido text() Selecciona cualquier nodo de tipo texto y es precisamente lo que hemos estado poniendo en el fichero evalua_xpath.xlparavisualizarelcontenidodelosnodosseleccionadosporcadaunadelasexpresionesdelos ejemplosyejercicios. Ejemplo:Seleccionareltextodetodoslosnodosparrafo: //parrafo/text() Ejemplo:SeleccionarTODOeltextoquecuelgadetodoslosnodosparrafo(ojo:vesladiferenciaconel anterior?) //parrafo//text() comment() Permiteseleccionarcualquiernododetipocomentario. processing-instruction() Cualquiernododetipodeinstruccindeproceso,independientementedesudestino. processing-instruction( destino ) Cualquiernododetipodeinstruccindeprocesorelativoaldestinoespecificado.
processing-instruction( cursor ) Cualquiernododetipodeinstruccindeprocesoconeldestinocursor.
3.5. Predicados
[Link],unpredicadopermiterestringirel conjunto de nodos seleccionados por un hacha a aquellos que cumplen cierta condicin. Dicha condicin es una expresinXPathyseexpecificaentrecorchetes. Ejemplo:Seleccionartodosloscapituloquetenganunparrafoquetengaalgnelementoconatributohref: //capitulo[parrafo/*[@href]] [Link] estoscasos,[Link] ejemplo. Ejemplo:Seleccionartodosloscapituloquetenganunparrafoquetengaalgnelementoconatributohref yqueellosmismos(loscapitulo)tenganelatributopublicavalorsi: //capitulo [parrafo/*[@href]] [@public='si'] Aunquetambinsepuedehacerusodeloperadorandencerrandoentreparntesislosdistintospredicadoslogicos. Ejemplosimilaralanterior //capitulo[ (parrafo/*[@href]) and (@public='si')] Tambinsepuedehacerusodelaoperacinor. Esisteotrotipodeoperacionorqueutilizalabarravertical:|separandonodospredicados,sinodosexpresionesXPath. Ejemplo:Seleccionartodosloscapituloquetenganunparrafoquetengaalgnelementoconatributohref otodoslosapendice: //capitulo[parrafo/*[@href]]|//apendice Porltimo,tambinpodemosespecificarconnotlanegacindealgunadelasnegacionesdelpredicado. Seleccionartodosloscapituloquenotenganelatributopublic //capitulo[not(@public)] Predicados con funciones de cardinalidad Existen,porltimo, ciertasfuncionesquenos vana servir pararestringir elconjunto de nodos devueltos enuna [Link]:position(),last()eid(). position() Seleccionarelsegundocapitulo: //capitulo[position()=2] Estafuncinsepuedesimularponiendosimplementeelnmeroentrecorchetes. Mismoejemploanterior:seleccionarelsegundocapitulo:
//capitulo[2] last() Seleccionarelltimocapitulo: //capitulo[last()] Seleccionartodosloscapitulomenoselltimo: //capitulo[not(position()=last())] Estasfuncionessepuedenusarconexpresionesmatemticas,comoenelsiguienteejemplo. Seleccionarelpenltimocapitulo: //capitulo[last()-1] id() Seleccionarlosparrafohijosdelelementoconid="capitulo_1": id( "capitulo_1" )/parrafo Hayquetenerencuentaundetalle:slosepodrusarenaquellosficherosXMLqueseanvalidadosporunDTDenel queseespecifiquequeelatributoidesnico.
4. Apndice
4.1. Ejercicios
HemoscreadounadireccinwebenlaquepuedeshacerejerciciosdeXPath:ejercicios_xpath.html ElficheroXMLsobreelquetratanlosejercicioses:ejercicios_xpath_xml.html Deberastenerloalavistaparahacerlosejercicios.