Академический Документы
Профессиональный Документы
Культура Документы
Introduccin
1.1 Qu es y para qu sirve
TodoelprocesamientorealizadoconunficheroXMLestbasadoenlaposibilidaddedireccionaroaccederacadauna delaspartesquelocomponen,demodoquepodamostratarcadaunodeloselementosdeformadiferenciada. EltratamientodelficheroXMLcomienzaporlalocalizacindelmismoalolargodelconjuntodedocumentos existentesenelmundo.Parallevaracaboestalocalizacindeformaunvoca,seutilizanlosURI(UnifomResource Identifiers),deloscualeslosURL(UnifomResourceLocators)sonsindudalosmsconocidos. UnavezlocalizadoeldocumentoXML,laformadeseleccionarinformacindentrodelesmedianteelusodeXPath, queeslaabreviacindeloqueseconocecomoXMLPathLanguage.ConXPathpodremosseleccionaryhacer referenciaatexto,elementos,atributosycualquierotrainformacincontenidadentrodeunficheroXML. XPathensesunlenguajesofisticadoycomplejo,perodistintodeloslenguajesproceduralesquesolemosusar(C, C++,Basic,Java...).Adems,comocasitodoenelmundodeXML,anestenestadodedesarrollo,porloquenoes fcilencontrarherramientasqueincorporentodassusfuncionalidades. XPathesasuvezlabasesobrelaquesehanespecificadonuevasherramientasqueaprovecharparaeltratamientode documentosXML.HerramientastalescomoXPointer,XLinkyXQL(ellenguajequemanejalosdocumentosXML comosideunabasededatossetratase),quetambinestnenestadodedesarrollo,peroquesindudacambiarnel modoenqueactualmenteconcebimoslanavegacinporlaWeb.As,XPathsirveparadecircmodebeprocesaruna hojadeestiloelcontenidodeunapginaXML,perotambinparapoderponerenlacesocargarenunnavegadorzonas determinadasdeunapginaXML,envezdetodalapgina.
</parrafo> <parrafo destacar="si"> Ella, inocente cual <enlace href="http://www.enlace.es">mariposa</enlace> 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="http://www.abejilla.es">abejilla</enlace> 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="http://www.pajarillo.es">abejilla</enlace> 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...
contextoqueenesemomentoexista.EnelmomentoenqueelevaluadordeXPathlocalizaelnodoraz,stepasaaser elnodocontextodedichaexpresin. Siguiendoconnuestroejemplo,elanalizadorleeraahoralibro,locualledicequeseleccioneTODOSloselementos quecuelgandelnodocontexto(queatendiendoalprrafoanterioreselnodoraz)quesellamenlibro.Bueno...en estecasosolohayuno...porque(otravez)solopuedehaberunelementoraz. Sigamosavanzandoconnuestroejemplo.Acontinuacinelanalizadorleeracapitulo,locualledicequeseleccione TODOSloselementosquecuelgandelnodocontexto(queatendiendoalprrafoanterioreselnodolibro). Enundiscoseraimposiblequehubieradosdirectoriosconelmismonombrecolgandodeunmismodirectoriopadre. Sinembargo,ennuestrodocumentoXMLpodemosvercomohaydoselementos capitulo colgandodelelemento razlibro.Portanto,enestosmomentoshaydoselementosqueencajanconelpatrn/libro/capitulo. ElanalizadorcontinualeyendolaexpresinXPathquelehemosdadoyllegaaparrafo.Conelloleestamosdiciendo 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...yassucesivamente.Elresultadofinal esunnuevoconjuntodenodos(oparasermsprecisos,conjuntodepunterosanodo)queencajanconelpatrn buscado. Predicados Porlopocoquellevamosvisto,podemospensarqueXPathesungranmecanismoparaseleccionarmuchosnodosala vez,locualesmuytil.Peroqupasasisoloqueremosseleccionarunnodoquecumpleciertascaractersticas?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.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <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 fichero.Ojo:nosedebequitar/text(),peroesporquenosvaaservirparapodercomprobarvisualmentequeslose hanseleccionadolosnodosquenosinteresaban;insistimos,laexpresinXPathnonecesitaacabarcon/text(),pero laponemosparaquenosotrosveamosmejorelresultadoenelnavegador. Paraversifunciona,cargaenunnavegadordepginaswebmodernoelficherolibro.xmlquehasguardadoypodrs vercmosevisualizanslolosnodosquehayaselegido. Usando Java Comoalternativa,hemosdesarrolladounprogramaJavaquerecibeeldocumentoXMLaprocesar,ypidequeseteclee laexpresin.MediantelasclasesXPathyXPathExpressionpodemosbuscarlaexpresineneldocumentoXML.
importjava.io.*; importjavax.xml.parsers.DocumentBuilderFactory; importjavax.xml.xpath.*; importorg.w3c.dom.Document; importorg.w3c.dom.Element; importorg.xml.sax.InputSource; publicclassDemoXPath{ publicDemoXPath(){} publicstaticvoidmain(String[]args){ if(args.length!=1){ System.out.println("\nUSO:javaDemoXPathdocumento.xml\n"); System.exit(0); } DemoXPathdemoxpath=newDemoXPath(); try{ System.out.print("\nIntroducelaexpresiondebusqueda:"); BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in)); Stringbusqueda=stdin.readLine(); XPathxpath=XpathFactory.newInstance().newXPath(); DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); DocumentXMLDoc=factory.newDocumentBuilder().parse(newInputSource(new FileInputStream(args[0]))); Elementelement=XMLDoc.getDocumentElement(); XPathExpressionexp; exp=xpath.compile(busqueda); System.out.println("=>\n"+(String) exp.evaluate(element,XPathConstants.STRING)+"\n"); }catch(Exceptionex){ System.out.println("Error:"+ex.toString()); } }//delmain }//deladefinicindeclase
3.3. Hachas?Ejes?
Laverdadesquenosabamuybiencomotraducireltrminoaxesquesignificaalgoascomocercenaropodar,aunque tambinhacha.Lovoyatraducirporhachaqueseguroquedespusdeunpardeprrafosseconvierteenalgonormal. Digamosqueun hacha includaenun locationpath realizaunaseleccindenodosdentrodelrbol(omejordicho, dentrodelsubrbolquecuelgadelnodooconjuntodenodoscontexto)deacuerdoconalgnpatrn.Esdecir,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::). SirveparaseleccionarTODOSlosnodosquedescendiendandelconjuntodenodoscontexto.Esdecir,nosololoshijos delosnodoscontexto,sinotambinloshijosdeloshijos,yloshijosdeestos,etc.
Ejemplo:Seleccionartodoslosparrafodeunlibro: /libro//parrafo Ejemplo:Seleccionartodoslosdescendientesdeparrafoquetienenunatributohref. //parrafo//*[@href] Ejemplo:Mostrarelvalordelatributohrefdelcasoanterior:. //parrafo//*[@href]/@href Self Seespecificamedianteelpunto(.). Esmuytilpuessirveparaseleccionarelnodocontexto.Porejemplo,supongamosquedeseamosseleccionartodoslos parrafo descendientes del nodo contexto. No podemos escribir //parrafo, dado que seleccionara todos los descendientesdelnodoraz.Porello,laformacorrectaes:.//parrafo NoesfcilproponerunejemploniejercicioteniendoencuentaqueannoconocemosellenguajeXSLT.Endicho momentoseverconmsclaridadlagranutilidaddeestehacha. Parent Aligualqueenlossistemasdeficheros,seutilizanlosdospuntosparaidentificarlo:.. Elcomportamientodeestehachaesunpocoextraoalprincipiodadoquerealizaunpasohaciaatrsenelrbolde nodos. Ejemplo:Seleccionartodoslosnodosquetienenalgnhijodetipoparrafo: //parrafo/.. Ejemplo:Seleccionartodoslosnodoscapituloquetienenalgnhijodetipoparrafo: //parrafo/../../capitulo Obien: //capitulo/parrafo/.. Ejercicio:Seleccionartodoslosnodosquetienenunhijodetipoenlace. Ancestor Detodaslashachasquepodemosusar,estaeslanicaquenotieneningunaformadeabreviacin,sinoquehayque ponerlacomoancestor:: Ancestoresaparentloquedescendantesachild.Esdecir,devuelvetodosloselementosdeloscualesel nodocontextoesdescendiente. Ejemplo:Seleccionartodosloselementosquetienenentresusdescendientesalgnparrafo //parrafo/ancestor::*
3.5. Predicados
Yahemostenidoqueintroducirlospredicadosenprrafosanteriores.Bsicamente,unpredicadopermiterestringirel conjunto de nodos seleccionados por un hacha a aquellos que cumplen cierta condicin. Dicha condicin es una expresinXPathyseexpecificaentrecorchetes. Ejemplo:Seleccionartodosloscapituloquetenganunparrafoquetengaalgnelementoconatributohref: //capitulo[parrafo/*[@href]] Sernmuchaslasocasionesenquedeseemosquelosnodosaseleccionarnocumplanunasinovariascondiciones.En estoscasos,lospredicadossepuedensucederunoaotrohaciendoelefectodelaoperacinAND.Comoenelsiguiente 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 expresinXPathbasndoseenlaposicindelelementodevuelto.Talesfuncionesson: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.