XPath - Guia rápido

Antes de aprender XPath, devemos primeiro entender XSL que significa Esensível Sfolha de papel Llinguagem. É semelhante ao XML como o CSS é ao HTML.

Necessidade de XSL

No caso de documentos HTML, as tags são predefinidas como table, div, span, etc. O navegador sabe como adicionar estilo a eles e exibi-los usando estilos CSS. Mas, no caso de documentos XML, as tags não são predefinidas. Para entender e definir o estilo de um documento XML,World Wide Web Consortium (W3C)desenvolveu XSL que pode atuar como uma linguagem de folha de estilo baseada em XML. Um documento XSL especifica como um navegador deve processar um documento XML.

A seguir estão as partes principais do XSL -

  • XSLT - usado para transformar documentos XML em vários outros tipos de documentos.

  • XPath - usado para navegar em documentos XML.

  • XSL-FO - usado para formatar documentos XML.

O que é XPath?

XPath é uma recomendação oficial do World Wide Web Consortium (W3C). Ele define um idioma para localizar informações em um arquivo XML. É usado para percorrer elementos e atributos de um documento XML. XPath fornece vários tipos de expressões que podem ser usadas para consultar informações relevantes do documento XML.

  • Structure Definitions - XPath define as partes de um documento XML como elemento, atributo, texto, namespace, instrução de processamento, comentário e nós de documento

  • Path Expressions - XPath fornece nós de seleção de expressões de caminho poderosas ou lista de nós em documentos XML.

  • Standard Functions - XPath fornece uma rica biblioteca de funções padrão para manipulação de valores de string, valores numéricos, comparação de data e hora, manipulação de nó e QName, manipulação de sequência, valores booleanos etc.

  • Major part of XSLT - XPath é um dos principais elementos do padrão XSLT e é necessário ter conhecimento para trabalhar com documentos XSLT.

  • W3C recommendation - XPath é uma recomendação oficial do World Wide Web Consortium (W3C).

Deve-se manter os seguintes pontos em mente, ao trabalhar com XPath -

  • XPath é o componente principal do padrão XSLT .
  • O XSLT não funciona sem o XPath.
  • XPath é a base de XQuery e XPointer.

Uma expressão XPath geralmente define um padrão para selecionar um conjunto de nós. Esses padrões são usados ​​pelo XSLT para realizar transformações ou pelo XPointer para fins de endereçamento.

A especificação XPath especifica sete tipos de nós que podem ser a saída da execução da expressão XPath.

  • Root
  • Element
  • Text
  • Attribute
  • Comment
  • Instrução de Processamento
  • Namespace

XPath usa uma expressão de caminho para selecionar o nó ou uma lista de nós de um documento XML.

A seguir está a lista de caminhos e expressões úteis para selecionar qualquer nó / lista de nós de um documento XML.

S.No. Expressão e Descrição
1

node-name

Selecione todos os nós com o nome "nodename" fornecido

2

/

A seleção começa a partir do nó raiz

3

//

A seleção começa a partir do nó atual que corresponde à seleção

4

.

Seleciona o nó atual

5

..

Seleciona o pai do nó atual

6

@

Seleciona atributos

7

student

Exemplo - Seleciona todos os nós com o nome "aluno"

8

class/student

Exemplo - Seleciona todos os elementos do aluno que são filhos da classe

9

//student

Seleciona todos os elementos do aluno, não importa onde eles estejam no documento

Exemplo

Neste exemplo, criamos um documento XML de amostra, students.xml e seu documento de folha de estilo students.xsl que usa as expressões XPath em select atributo de várias tags XSL para obter os valores do número do rolo, nome, sobrenome, apelido e marcas de cada nó de aluno.

students.xml

<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

students.xsl

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">  

   <xsl:template match = "/">
      <html>
         <body>
            <h2>Students</h2>
            <table border = "1">
               <tr bgcolor = "#9acd32">
                  <th>Roll No</th>
                  <th>First Name</th>
                  <th>Last Name</th>
                  <th>Nick Name</th>
                  <th>Marks</th>
               </tr>
               <xsl:for-each select = "class/student">
                  <tr>
                     <td> <xsl:value-of select = "@rollno"/></td>
                     <td><xsl:value-of select = "firstname"/></td>
                     <td><xsl:value-of select = "lastname"/></td>
                     <td><xsl:value-of select = "nickname"/></td>
                     <td><xsl:value-of select = "marks"/></td>
                  </tr>
               </xsl:for-each>
            </table>
         </body>
      </html>
   </xsl:template>

</xsl:stylesheet>

Verifique a saída

Neste capítulo, veremos a expressão XPath em detalhes cobrindo tipos comuns de nós, definições e manipulações de XPath.

S.No. Tipo e descrição do nó
1 Raiz

Nó do elemento raiz de um documento XML.

2 Elemento

Nó do elemento.

3 Texto

Texto de um nó de elemento.

4 Atributo

Atributo de um nó de elemento.

5 Comente

Comente

O caminho do local especifica a localização do nó no documento XML. Este caminho pode ser absoluto ou relativo. Se o caminho do local começar com o nó raiz ou com '/', então é um caminho absoluto. A seguir estão alguns exemplos de localização dos elementos usando o caminho absoluto.

/class/student - selecionar nós de alunos dentro do nó raiz da classe.

<xsl:for-each select = "/class/student">

/class/student/firstname - selecione o primeiro nome de um nó de aluno dentro do nó raiz da classe.

<p><xsl:value-of select = "/class/student/firstname"/></p>

Exemplo

Neste exemplo, criamos um documento XML de amostra students.xml e seu documento de folha de estilo students.xsl que usa as expressões XPath.

A seguir está o XML de amostra usado.

students.xml

<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

students.xsl

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">  
	
   <xsl:template match = "/" >
      <html>
         <body>
            <h3>Details of each Students. </h3>
            <table border = "1">
               <tr bgcolor = "#9acd32">
                  <th>Roll No</th>
                  <th>First Name</th>
                  <th>Last Name</th>
                  <th>Nick Name</th>
                  <th>Marks</th>		 
               </tr>	
					
               <tr>
                  <td><xsl:value-of select = "/class/student[1]/@rollno"/></td>
                  <td><xsl:value-of select = "/class/student[1]/firstname"/></td>
                  <td><xsl:value-of select = "/class/student[1]/lastname"/></td>
                  <td><xsl:value-of select = "/class/student[1]/nickname"/></td>
                  <td><xsl:value-of select = "/class/student[1]/marks"/></td>		 
               </tr>
					
               <tr>
                  <td>
                     <xsl:value-of select = "/class/student/@rollno"/>
                  </td>
                  <td><xsl:value-of select = "/class/student[2]/firstname"/></td>
                  <td><xsl:value-of select = "/class/student[2]/lastname"/></td>
                  <td><xsl:value-of select = "/class/student[2]/nickname"/></td>
                  <td><xsl:value-of select = "/class/student[2]/marks"/></td>		 
               </tr>
					
               <tr>
                  <td>
                     <xsl:value-of select = "/class/student[3]/@rollno"/>
                  </td>
                  <td><xsl:value-of select = "/class/student[3]/firstname"/></td>
                  <td><xsl:value-of select = "/class/student[3]/lastname"/></td>
                  <td><xsl:value-of select = "/class/student[3]/nickname"/></td>
                  <td><xsl:value-of select = "/class/student[3]/marks"/></td>		 
               </tr>
      
            </table> 
   
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

Verifique a saída

O caminho do local especifica a localização do nó no documento XML. Este caminho pode ser absoluto ou relativo. Se o caminho do local começar com o nó que selecionamos, então é um caminho relativo.

A seguir estão alguns exemplos de localização dos elementos usando o caminho relativo.

firstname - selecione o primeiro nome relacionado aos nós de alunos.

<p><xsl:value-of select = "firstname"/></p>

Exemplo

Neste exemplo, criamos um documento XML de amostra students.xml e seu documento de folha de estilo students.xsl que usa as expressões XPath.

A seguir está o XML de amostra usado.

students.xml

<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

students.xsl

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
	
   <xsl:template match = "/" >
      <html>
         <body>
            <h3>Details of each Students. </h3>
            <table border = "1">
               <tr bgcolor = "#9acd32">
                  <th>Roll No</th>
                  <th>First Name</th>
                  <th>Last Name</th>
                  <th>Nick Name</th>
                  <th>Marks</th>		 
               </tr>		 
					
               <xsl:for-each select = "/class/student">
                  <tr>
                     <td><xsl:value-of select = "@rollno"/></td>
                     <td><xsl:value-of select = "firstname"/></td>
                     <td><xsl:value-of select = "lastname"/></td>
                     <td><xsl:value-of select = "nickname"/></td>
                     <td><xsl:value-of select = "marks"/></td>		 
                  </tr>
               </xsl:for-each>
            </table> 
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

Verifique a saída

Como o caminho de localização define a localização de um nó usando caminho absoluto ou relativo, os eixos são usados ​​para identificar os elementos por sua relação, como parent, child, sibling, etc. Os eixos são nomeados assim porque se referem aos eixos nos quais os elementos estão localizados em relação a um elemento.

A seguir está a lista de vários valores do eixo.

S.No. Eixo e descrição
1

ancestor

Representa os ancestrais do nó atual, que incluem os pais até o nó raiz.

2

ancestor-or-self

Representa o nó atual e seus ancestrais.

3

attribute

Representa os atributos do nó atual.

4

child

Representa os filhos do nó atual.

5

descendant

Representa os descendentes do nó atual. Os descendentes incluem os filhos do nó até o nó folha (não há mais filhos).

6

descendant-or-self

Representa o nó atual e seus descendentes.

7

following

Representa todos os nós que vêm depois do nó atual.

8

following-sibling

Representa os seguintes irmãos do nó de contexto. Os irmãos estão no mesmo nível que o nó atual e compartilham seu pai.

9

namespace

Representa o namespace do nó atual.

10

parent

Representa o pai do nó atual.

11

preceding

Representa todos os nós que vêm antes do nó atual (ou seja, antes de sua tag de abertura).

12

self

Representa o nó atual.

A seguir estão alguns exemplos sobre o uso de eixos.

firstname - selecione o primeiro nome relacionado aos nós de alunos.

<p><xsl:value-of select = "firstname"/></p>
<xsl:value-of select = "/class/student/preceding-sibling::comment()"/>

Exemplo

Neste exemplo, criamos um documento XML de amostra students.xml e seu documento de folha de estilo students.xsl que usa as expressões XPath.

A seguir está o XML de amostra usado.

students.xml

<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
   <!-- Comment: This is a list of student -->
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

students.xsl

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> 
	
   <xsl:template match = "/" >
      <html>
         <body>  
            <xsl:value-of select = "/class/student/preceding-sibling::comment()"/>
            <br/>
            <xsl:text>First Student: </xsl:text>
            <xsl:value-of select = "/class/student/child::firstname" />    
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

Verifique a saída

Neste capítulo, veremos os operadores e funções XPath em detalhes cobrindo o XPath comumente usado defines e handles. XPath define Operadores e funções nos tipos Nodes, String, Number e Boolean.

A seguir está a lista sobre a qual vamos discutir.

S.No. Operadores / funções e descrição
1 Operadores de comparação

Operadores de comparação para comparar valores.

2 Operadores booleanos

Operadores booleanos para verificar as funcionalidades 'e', ​​'ou' & 'não'.

3 Funções / operadores numéricos

Operadores / funções em números.

4 Funções de String

Várias funções de string.

5 Funções / operadores do nó

Várias funções e operadores atuando em nós.

XPath define os seguintes curingas em nós a serem usados ​​com as expressões XPath.

S.No. WildCard e descrição
1

*

usado para corresponder a qualquer nó.

2

.

usado para corresponder ao nó atual no contexto.

3

@*

usado para corresponder a qualquer atributo

4

node()

usado para combinar nó de qualquer tipo

Exemplo

Este exemplo cria uma tabela do elemento <student> com seus detalhes, iterando sobre cada aluno.

students.xml

<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

students.xsl

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
	
   <xsl:template match = "/">
      <html>
         <body>
            <h2>Students</h2>
            <xsl:apply-templates select = "class/*" />
         </body>
      </html>
   </xsl:template>

   <xsl:template match = "class/*">
      <xsl:apply-templates select = "@rollno" />
      <xsl:apply-templates select = "firstname" />
      <xsl:apply-templates select = "lastname" />
      <xsl:apply-templates select = "nickname" />
      <xsl:apply-templates select = "marks" />
      <br />
   </xsl:template>

   <xsl:template match = "@rollno">
      <span style = "font-size = 22px;">
         <xsl:value-of select = "." />
      </span>
      <br />
   </xsl:template>

   <xsl:template match = "firstname">
      First Name:<span style = "color:blue;">
         <xsl:value-of select = "." />
      </span>
      <br />
   </xsl:template>

   <xsl:template match = "lastname">
      Last Name:<span style = "color:green;">
         <xsl:value-of select = "." />
      </span>
      <br />
   </xsl:template>

   <xsl:template match = "nickname">
      Nick Name:<span style = "color:red;">
         <xsl:value-of select = "." />
      </span>
      <br />
   </xsl:template>

   <xsl:template match = "marks">
      Marks:<span style = "color:gray;">
         <xsl:value-of select = "." />
      </span>
      <br />
   </xsl:template>

</xsl:stylesheet>

Verifique a saída

Predicado refere-se à expressão XPath escrita entre colchetes. Refere-se a restringir os nós selecionados em um conjunto de nós para alguma condição. Por exemplo,

S.No. Predicado e descrição
1

/class/student[1]

Selecione o primeiro elemento do aluno que é filho do elemento da classe.

2

/class/student[last()]

Selecione o último elemento do aluno que é filho do elemento da classe.

3

/class/student[@rolllno = 493]

Selecione o elemento do aluno com rollno 493.

4

/class/student[marks>85]

Selecione o elemento do aluno com notas> 85.

Exemplo

Este exemplo cria uma tabela do elemento <student> com seus detalhes, iterando sobre cada aluno. Ele calcula a posição do nó do aluno e depois imprime os detalhes do (s) aluno (s) junto com o número de série.

students.xml

<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

students.xsl

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">  

   <xsl:template match = "/">
      <html>
         <body>
            <h2>Students</h2>
            <table border = "1">
               <tr bgcolor = "#9acd32">	 
                  <th>Roll No</th>
                  <th>First Name</th>
                  <th>Last Name</th>
                  <th>Nick Name</th>
                  <th>Marks</th>	  
               </tr>
					
               <xsl:for-each select = "/class/student[1]">
                  <tr>	 
                     <td><xsl:value-of select = "@rollno"/></td>
                     <td><xsl:value-of select = "firstname"/></td>
                     <td><xsl:value-of select = "lastname"/></td>
                     <td><xsl:value-of select = "nickname"/></td>
                     <td><xsl:value-of select = "marks"/></td>	 
                  </tr>	
               </xsl:for-each>
					
               <xsl:for-each select = "/class/student[last()]">
                  <tr>	 
                     <td><xsl:value-of select = "@rollno"/></td>
                     <td><xsl:value-of select = "firstname"/></td>
                     <td><xsl:value-of select = "lastname"/></td>
                     <td><xsl:value-of select = "nickname"/></td>
                     <td><xsl:value-of select = "marks"/></td>	 
                  </tr>	
               </xsl:for-each>
	
               <xsl:for-each select = "/class/student[@rollno = 493]">
                  <tr>	 
                     <td><xsl:value-of select = "@rollno"/></td>
                     <td><xsl:value-of select = "firstname"/></td>
                     <td><xsl:value-of select = "lastname"/></td>
                     <td><xsl:value-of select = "nickname"/></td>
                     <td><xsl:value-of select = "marks"/></td>	 
                  </tr>	
               </xsl:for-each>

               <xsl:for-each select = "/class/student[marks > 85]">
                  <tr>	 
                     <td><xsl:value-of select = "@rollno"/></td>
                     <td><xsl:value-of select = "firstname"/></td>
                     <td><xsl:value-of select = "lastname"/></td>
                     <td><xsl:value-of select = "nickname"/></td>
                     <td><xsl:value-of select = "marks"/></td>	 
                  </tr>	
               </xsl:for-each>
	
	
            </table>
  
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

Verifique a saída