XPath um conjunto de regras de sintaxe para definir partes de um documento XML. XPath o elemento principal no padro W3C XSLT. Sem o conhecimento de XPath voc no ser capaz de criar documentos XSLT.
Introduo ao XPath
XPath um conjunto de regras de sintaxe para definir partes de um documento XML. O que XPath? XPath uma sintaxe para definir partes de um doc umento XML XPath usa c aminhos para definir elementos XML XPath define uma biblioteca de funes padro XPath o elemento princ ipal em XSLT XPath no esc rito em XML XPath um padro W3C Como caminhos de arquivos tradicionais XPath usa expresses de c aminho para identificar ns em um documento XML. Essas expresses de caminho se parecem muito com as expresses que voc v quando voc trabalha num sistema de arquivos de um computador: w3schools/xpath/default.asp Exemplo de XPath Veja esse documento XML simples:
<cd country="USA">
<title>Empire Burlesque</title>
<art
A expresso XPath abaixo seleciona todos os elementos price de todos os elementos cd do elemento catalog:
Nota: Se o caminho comea com uma barra ( / ) ele representa um caminho absoluto para um elemento! XPath define uma biblioteca de funes padro XPath define uma biblioteca de funes padro para trabalhar c om strings, nmeros e expresses booleanas. A expresso XPath abaixo seleciona todos os elementos cd que tem um elemento price que tem um valor maior que 10.80:
Sintaxe XPath
XPath usa expresses de caminho para localizar ns dentro de documentos XML. Documento XML de Exemplo Ns usaremos esse doc umento XML simples para descrever a sintaxe XPath:
<cd country="USA">
<title>Empire Burlesque</title>
<art
Doc umentos XML podem ser representados como rvores de ns (muito similar viso em rvore das pastas do seu c omputador). XPath usa uma expresso padro para identificar ns em um doc umento XML. Um padro XPath uma lista nomes de elementos filhos separada por barras que desc reve o caminho atravs do doc umento XML. O padro "seleciona" elementos que combinam com o c aminho. A expresso XPath a seguir seleciona todos os elementos preo de todos os elementos cd do elemento catalog: Nota: Se o caminho comea com uma barra ( / ) ele representa um caminho absoluto para um elemento! Nota: Se o caminho comea com duas barras ( // ) ento todos os elementos no documento que se encaixam no critrio sero selecionados (mesmo que eles estejam em nveis diferentes da rvore XML)! A expresso XPath a seguir seleciona todos os elementos c d no documento:
/catalog/cd/price
//cd
Curingas ( * ) podem ser usados para selec ionar elementos XML desconhec idos. A expresso XPath a seguir seleciona todos os elementos filhos de todos os elementos cd do elemento catalog: A expresso XPath a seguir seleciona todos os elementos price que so elementos netos do elemento catalog: A expresso XPath a seguir seleciona todos os elementos price que tm dois anc estrais: A expresso XPath a seguir seleciona todos os elementos no documento:
/catalog/cd/* /catalog/*/price
/*/*/price
//*
Selecionando Sees
Usando-se c olc hetes numa expresso XPath voc pode especific ar um elemento adiante. A expresso XPath a seguir seleciona o primeiro elemento cd filho do elemento catalog:
/catalog/cd[1] /catalog/cd[last()]
A expresso XPath a seguir seleciona o ltimo elemento cd filho do elemento catalog (Nota: no existe a funo first()): A expresso XPath a seguir seleciona todos os elementos cd do elemento catalog que tem um elemento price:
/catalog/cd[price]
A expresso XPath a seguir seleciona todos os elementos cd do elemento catalog que tem um elemento price com valor de 10.90: /catalog/cd[price=10.90] A expresso XPath a seguir seleciona todos os elementos price de todos os elementos cd do elemento catalog que tem um elemento price c om valor de 10.90: /catalog/cd[price=10.90]/price
/catalog/cd/title
| /catalog/cd/artist
A expresso XPath a seguir seleciona todos os elementos title e artist do documento:
A expresso XPath a seguir seleciona todos os elementos title, artist e price do documento:
A expresso XPath a seguir seleciona todos os elementos title do elemento cd do elemento catalog, e todos os elementos artist no documento: /catalog/cd/title | //artist Em XPath todos os atributos so especificados pelo prefixo "@". Esta expresso XPath selec iona todos os atributos chamados country:
//@country //cd[@country]
Esta expresso XPath selec iona todos os elementos cd que tem um atributo chamado country : Esta expresso XPath selec iona todos os elementos cd que tem algum atributo:
//cd[@*] //cd[@country='UK']
Esta expresso XPath selec iona todos os elementos cd que tem um atributo chamado c ountry com valor 'UK':
/step/step/... step/step
Os nveis de localizao so avaliados em ordem um de c ada vez, da esquerda pra direita. Cada nvel avaliado segundo os ns no conjunto de ns atual. Se o caminho local absoluto, o c onjunto de ns atual o n raiz. Se o caminho loc al relativo, o conjunto de ns atual consiste do n onde a expresso est sendo usada. Nveis de localiza o c onsistem de: um eixo (especific a a relao de rvore entre os ns selecionados pelo nvel de localizao e o n atual) um n teste (especific a o tipo de n e o nome expandido dos ns selecionados pelo nvel de loc alizao) zero ou mais predicados (usa expresses para refinar mais o conjunto de ns selecionado pelo nvel de localiza o) A sintaxe para um nvel de localiza o : Exemplo:
nomeeixo::noteste[predicado]
child::price[price=9.90]
Eixos e Ns de Teste
Um eixo define um conjunto de ns relativo ao n atual. Um n de teste usado para identificar um n dentro de um eixo. Ns podemos executar um n de teste por nome ou por tipo. Nome do Eixo Descrio anc estor Contm todos os anc estrais (pais, avs, etc) do n atual. Nota: Este eixo incluir sempre o n raiz, a menos que o n atual seja o n raiz anc estor-or-self Contm o n atual mais todos os seus anc estrais (pai, av, etc ) attribute Contm todos os atributos do n atual child Contm todos os filhos do n atual descendant Contm todos os descendentes (filhos, netos, etc ) do n atual. Nota: Este eixo nunca c ontm atributos ou ns namespace descendant-or-self Contm o n atual mais todos os seus descendentes (filhos, netos, etc ) following Contm tudo no doc umento depois da tag de fechamento do n atual following-sibling Contm todos os irmos depois do n atual. Nota: Se o n atual um n atributo ou um n namespace, este eixo estar vazio
Contm todos os ns namespac e do n atual Contm o pai do n atual Contm tudo no doc umento que est antes da tag de abertura do n atual Contm todos os irmos antes do n atual. Nota: Se o n atual um n atributo ou um n namespace, este eixo estar vazio Contm o n atual
Exemplo child::cd Seleciona attribute::src Seleciona child::* Seleciona attribute::* Seleciona child::text() Seleciona child::node() Seleciona desc endant::cd Seleciona anc estor::cd Seleciona anc estor-or-self::cdSeleciona child::*/c hild::pric e Seleciona / Seleciona Predicados
Resultado todos os elementos c d que so filhos do n atual (se o n atual no tem cds filhos, ser selecionado um conjunto vazio de ns) o atributo src do n atual (se o n atual no tem atributo src, ser selecionado um conjunto vazio de ns) todos os elementos filhos do n atual todos os atributos do n atual o n texto filho do n atual todos os filhos do n atual todos os elementos c d descendentes do n atual todos os cds ancestrais do n atual todos os cds ancestrais do n atual e, se o n atual um elemento cd, seleciona o n atual tambm todos os preos netos do n atual a raiz do documento
Um predicado filtra um c onjunto de ns em um novo conjunto de ns. Um predicado fic a dentro de colchetes ( [] ). Exemplos Exemplo child::pric e[price=9.90] Selec iona child::cd[position()=1] Selec iona child::cd[position()=last()] Selec iona child::cd[position()=last()-1] Selec iona child::cd[position()<6] Selec iona /descendant::cd[position()=7] Selec iona child::cd[attribute::type="classic"]Selec iona Sintaxe Abreviada dos Caminhos Locais Abreviaes podem ser usadas para descrever um caminho local. A abreviao mais importante que child:: pode ser omitido de um nvel de localiza o. Abrev. Significado Exemplo nada child:: c d o mesmo que child::cd @ attribute:: c d[@type="classic"] o mesmo que child::cd[attribute::type="c lassic "] . self::node() .//c d o mesmo que self::node()/desc endant-or-self::node()/c hild::cd .. parent::node() ../cd o mesmo que parent::node()/c hild::cd //// /descendant-or-self::node()///c d o mesmo que /descendant-or-self::node()/c hild::c d Exemplos Exemplo cd * text() @src @* cd[1] cd[last()] */cd /book/chapter[3]/para[1] Resultado Selec iona todos os elementos cd que so filhos do n atual Selec iona todos os elementos filhos do n atual Selec iona todos os ns textos filhos do n atual Selec iona o atributo src do n atual Selec iona todos os atributos do n atual Selec iona o primeiro cd filho do n atual Selec iona o ltimo cd filho do n atual Selec iona todos os cds netos do n atual Selec iona o primeiro pargrafo do terc eiro captulo do livro Selec iona todos os elementos cds descendentes da raiz do documento e assim seleciona //cd todos os elementos c ds no mesmo documento c omo o n atual . Selec iona o n atual .//c d Selec iona os elementos cds desc endentes do n atual .. Selec iona o pai do n atual ../@src Selec iona o atributo src do pai do n atual cd[@type="classic "] Selec iona todos os cds filhos do n atual que tm o atributo "type" c om o valor "c lassic " cd[@type="classic "][5] Selec iona o quinto cd filho do n atual que tem o atributo "type" c om o valor "c lassic " cd[5][@type="c lassic"] Selec iona o quinto cd filho do n atual se esse filho tem o atributo "type" c om valor "classic" cd[@type and @country ]Selec iona todos os cds filhos do n atual que tm ambos os atributos "type" e "country" Expresses XPath XPath suporta expresses numricas, de igualdade, relacionais e booleanas. Expresses Numricas Expresses numricas so usadas para realizar opera es aritmticas em nmeros. Operador Descrio Exemplo Resultado + Adio 6 +4 10 Subtra o 6- 4 2 * Multiplic ao 6* 4 24 div Diviso 8 div 4 2 mod Mdulo (resto da diviso) 5 mod 2 1 Nota: XPath sempre c onverte c ada operando em um nmero antes de realizar um expresso aritmtic a. Expresses de Igualdade Resultado todos os elementos price que so filhos do n atual c om um pre o igual a 9.90 o primeiro cd filho do n atual o ltimo cd filho do n atual o penltimo cd filho do n atual os primeiros c inc o cds filhos do n atual o stimo elemento cd no doc umento todos os cds filhos do n atual que tm um atributo tipo com o valor "classic"
Expresses de igualdade so usadas para testar a igualdade entre dois valores. Operador Descrio Exemplo Resultado = Igual price=9.80 true (se o preo igual a 9.80) != Diferente price!=9.80 false Testando um conjunto de ns Se testada a igualdade do valor de teste em relao a um c onjunto de ns, o resultado verdadeiro se o c onjunto de ns c ontm algum n c om um valor igual ao valor de teste. Se testada a desigualdade do valor de teste em relao a um c onjunto de ns, o resultado verdadeiro se o conjunto de ns c ontm algum n c om um valor diferente ao valor de teste. O resultado que o conjunto de ns pode ser igual e diferente ao mesmo tempo!!! Expresses Relacionais Expresses relacionais so usadas para comparar dois valores. Operador Descrio Exemplo Resultado < Menor price<9.80 false (se o preo 9.80) <= Menor ou igualprice<=9.80 true > Maior price>9.80 false >= Maior ou igual price>=9.80 true Nota: XPath sempre c onverte c ada operando em um nmero antes de fazer a avaliao. Expresses Booleanas Expresses booleanas so usadas para comparar dois valores. OperadorDescrio Exemplo Resultado or Ou pric e=9.80 or pric e=9.70 true (se o preo 9.80) and E pric e<=9.80 and price=9.70false Funes XPath XPath contm uma biblioteca de funes para converso de dados. Biblioteca de Funes XPath A biblioteca de funes XPath c ontm um c onjunto de fun es centrais para c onverso e traduo de dados. Funes para Conjunto de Ns Nome count() Retorna o id() Seleciona last() Retorna o loc al-name() Retorna a name() Retorna o namespac e-uri()Retorna o position() Retorna a Funes de Strings Nome concat() contains() Descrio Retorna a concatenao de todos os argumentos Sintaxe string=c onc at(val1,val2,...) bool=contains(val,substr) string=normalize-space(string) bool=starts-with(string,substr) string(value) number=string-length(string) string=substring(string,start,length) string=substring-after(string,substr) string=substring-before(string,substr) Exemplo concat('The',' ','XML') -> Resultado: 'The XML' contains('XML','X') -> Restultado: true normalize-spac e(' The XML ') -> Resultado: 'The XML' starts-with('XML','X') -> Resultado: true string(314) -> Resultado: '314' string-length('Beatles') -> Resultado: 7 substring('Beatles',1,4) -> Resultado: 'Beat' substring-after('12/10','/') -> Resultado: '10' Descrio Sintaxe nmero de ns num conjunto de ns number=count(node-set) elementos pelo seu ID nico node-set=id(value) nmero da posi o do ltimo n na lista de ns processados number=last() parte local de um n. Um n normalmente consiste de um prefixo, os dois pontos, seguidos pelo nome localstring=local-name(node) nome do n string=name(node) namespace URI de um n especfico uri=namespace-url(node) posio na lista de ns do n que est sendo processado atualmente number=position()
Retorna verdadeiro se a segunda string est contida dentro da primeira string, seno retorna falso Remove espaos antes e depois de uma string e substitui todas normalizeas seqnc ias internas de espa os por um nico espao em spac e() branco startsRetorna verdadeiro se a primeira string come a com a segunda with() string, seno retorna falso string() Converte o argumento em string stringRetorna o nmero de c arac teres de uma string length() substring()Retorna um pedao da string substring- Retorna a parte da string que aparece depois do argumento substr after() substring- Retorna a parte da string que aparece antes do argumento before() substr
substring-before('12/10','/') -> Resultado: '12' translate('12:30','30','45') -------> Resultado: '12:45' ----------------Realiza uma substituio c arac ter por c arac ter. Ela proc ura no translate('12:30','03','54') -------> translate() argumento 'value' os caracteres contidos na 'string1' e substitui string=translate(value,string1,string2) Resultado: '12:45' ----------------cada c arac tere pelo carac tere da mesma posio na 'string2' translate('12:30','0123','abcd') -------> Resultado: 'bc :da' Funes Numricas Nome Descrio ceiling() Retorna o menor inteiro que no menor que o argumento (funo teto) floor() Retorna o maior inteiro que no maior que o argumento (funo cho) number()Converte o argumento em um nmero round() Arredonda o argumento para o inteiro mais prximo Sintaxe Exemplo number=ceiling(number)c eiling=(3.14) -> Resultado: 4 number=floor(number) floor(3.14) -> Resultado: 3 number=number(value) number('100') -> Resultado: 100 integer=round(number) round(3.14) -> Resultado: 3
sum()
Retorna o valor total de um conjunto de valores numric os num conjunto de nsnumber=sum(nodeset) sum(/cd/price)
Funes Booleanas Nome Descrio boolean()Converte o argumento 'value' em Booleano e retorna verdadeiro ou falso false() lang() not() true() Retorna falso Sintaxe bool=boolean(value) false() Exemplo: number(false()) -> Resultado: 0
Retorna verdadeiro se o argumento 'language' igual ao idioma do elemento xsl:lang, seno retorna bool=lang(language) falso Retorna verdadeiro se o argumento 'condition' falso, e falso se o argumento verdadeiro bool=not(condition) Exemplo: not(false()) true() Exemplo: number(true()) -> Resultado: Retorna verdadeiro 1
Exemplos XPath Ns iremos usar o catlogo de CDs do nosso tutorial de XML para demonstrar alguns exemplos XPath. O catlogo de CDs Se voc estudou o nosso tutorial de XML voc lembrar de documento XML: (Uma frao do catalogo)
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan<
Ns demonstraremos como selecionar ns de um documento XML usando a fun o selectNodes no Internet Explorer. Esta funo tem uma expresso de c aminho loc al c omo argumento:
xmlobject.selectNodes(Xpath expression)
Selecionando
Ns cd xmlDoc.selectNodes("/catalog/cd[0]")
O exemplo a seguir seleciona somente o primeiro n do c atlogo de c ds: Se voc tem o IE 5 ou superior voc pode fazer mais testes.
Nota: IE 5 implementou que [0] deveria ser o primeiro n, mas de acordo com o padro W3C, deve ser [1].
Selecionando Ns price
O exemplo a seguir seleciona todos os ns price do catlogo de c ds: Se voc tem o IE 5 ou superior voc pode fazer mais testes.
xmlDoc.selectNodes("/catalog/cd/price")
xmlDoc.selectNodes("/catalog/cd/price/text()")
xmlDoc.selectNodes("/catalog/cd[price>10.80]")
xmlDoc.selectNodes("/catalog/cd[price>10.80]/price")