XPath - szybki przewodnik

Zanim nauczymy się XPath, powinniśmy najpierw zrozumieć XSL, który oznacza Erozciągliwy Stylesheet Ludręka. Jest podobny do XML, jak CSS do HTML.

Potrzeba XSL

W przypadku dokumentów HTML, tagi są predefiniowane, takie jak table, div, span itp. Przeglądarka wie, jak dodać do nich styl i wyświetlić je za pomocą stylów CSS. Jednak w przypadku dokumentów XML tagi nie są predefiniowane. Aby zrozumieć i nadać styl dokumentowi XML,World Wide Web Consortium (W3C)opracował XSL, który może działać jako język arkuszy stylów oparty na XML. Dokument XSL określa, w jaki sposób przeglądarka powinna renderować dokument XML.

Oto główne części XSL -

  • XSLT - służy do przekształcania dokumentów XML w różne inne typy dokumentów.

  • XPath - służy do nawigacji po dokumentach XML.

  • XSL-FO - służy do formatowania dokumentów XML.

Co to jest XPath?

XPath jest oficjalną rekomendacją konsorcjum World Wide Web Consortium (W3C). Definiuje język, w którym można znaleźć informacje w pliku XML. Służy do przechodzenia między elementami i atrybutami dokumentu XML. XPath udostępnia różne typy wyrażeń, których można używać do uzyskiwania odpowiednich informacji z dokumentu XML.

  • Structure Definitions - XPath definiuje części dokumentu XML, takie jak element, atrybut, tekst, przestrzeń nazw, instrukcja przetwarzania, komentarz i węzły dokumentu

  • Path Expressions - XPath zapewnia zaawansowane wyrażenia ścieżek do wybierania węzłów lub listy węzłów w dokumentach XML.

  • Standard Functions - XPath zapewnia bogatą bibliotekę standardowych funkcji do manipulacji wartościami łańcuchowymi, wartościami liczbowymi, porównywaniem dat i godzin, manipulowaniem węzłami i QName, manipulowaniem sekwencjami, wartościami logicznymi itp.

  • Major part of XSLT - XPath jest jednym z głównych elementów standardu XSLT i musi posiadać wiedzę, aby pracować z dokumentami XSLT.

  • W3C recommendation - XPath jest oficjalną rekomendacją World Wide Web Consortium (W3C).

Podczas pracy z XPath należy pamiętać o następujących kwestiach -

  • XPath jest podstawowym składnikiem standardu XSLT .
  • XSLT nie może działać bez XPath.
  • XPath jest podstawą XQuery i XPointer.

Wyrażenie XPath ogólnie definiuje wzorzec służący do wybierania zestawu węzłów. Te wzorce są używane przez XSLT do wykonywania przekształceń lub przez XPointer do celów adresowania.

Specyfikacja XPath określa siedem typów węzłów, które mogą być wynikiem wykonania wyrażenia XPath.

  • Root
  • Element
  • Text
  • Attribute
  • Comment
  • Instrukcja przetwarzania
  • Namespace

XPath używa wyrażenia ścieżki, aby wybrać węzeł lub listę węzłów z dokumentu XML.

Poniżej znajduje się lista przydatnych ścieżek i wyrażeń umożliwiających wybranie dowolnego węzła / listy węzłów z dokumentu XML.

S.No. Wyrażenie i opis
1

node-name

Wybierz wszystkie węzły o podanej nazwie „nazwa węzła”

2

/

Wybór rozpoczyna się od węzła głównego

3

//

Wybór rozpoczyna się od bieżącego węzła, który pasuje do wyboru

4

.

Wybiera bieżący węzeł

5

..

Wybiera rodzica bieżącego węzła

6

@

Wybiera atrybuty

7

student

Przykład - zaznacza wszystkie węzły o nazwie „student”

8

class/student

Przykład - wybiera wszystkie elementy uczniów, które są dziećmi klasy

9

//student

Zaznacza wszystkie elementy uczniów bez względu na to, gdzie się znajdują w dokumencie

Przykład

W tym przykładzie utworzyliśmy przykładowy dokument XML, Students.xml i jego arkusz stylów students.xsl który używa wyrażeń XPath w ramach select atrybut różnych znaczników XSL, aby uzyskać wartości numeru pozycji, imienia, nazwiska, pseudonimu i ocen każdego węzła ucznia.

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>

Sprawdź dane wyjściowe

W tym rozdziale zobaczymy szczegółowo wyrażenie XPath obejmujące typowe typy węzłów, definicje i uchwyty XPath.

S.No. Typ i opis węzła
1 Korzeń

Węzeł elementu głównego dokumentu XML.

2 Element

Węzeł elementu.

3 Tekst

Tekst węzła elementu.

4 Atrybut

Atrybut węzła elementu.

5 Komentarz

Komentarz

Ścieżka lokalizacji określa lokalizację węzła w dokumencie XML. Ta ścieżka może być bezwzględna lub względna. Jeśli ścieżka lokalizacji zaczyna się od węzła głównego lub „/”, jest to ścieżka bezwzględna. Poniżej przedstawiono kilka przykładów lokalizowania elementów za pomocą ścieżki bezwzględnej.

/class/student - wybierz węzły uczniów w obrębie węzła głównego klasy.

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

/class/student/firstname - wybierz imię węzła ucznia w węźle głównym klasy.

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

Przykład

W tym przykładzie utworzyliśmy przykładowy dokument XML students.xml i jego dokument arkusza stylów students.xsl który używa wyrażeń XPath.

Poniżej przedstawiono przykładowy używany kod XML.

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>

Sprawdź dane wyjściowe

Ścieżka lokalizacji określa lokalizację węzła w dokumencie XML. Ta ścieżka może być bezwzględna lub względna. Jeśli ścieżka lokalizacji zaczyna się od węzła, który wybraliśmy, jest to ścieżka względna.

Poniżej znajduje się kilka przykładów lokalizowania elementów za pomocą ścieżki względnej.

firstname - wybierz imię związane z węzłami uczniów.

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

Przykład

W tym przykładzie utworzyliśmy przykładowy dokument XML students.xml i jego dokument arkusza stylów students.xsl który używa wyrażeń XPath.

Poniżej przedstawiono przykładowy używany kod XML.

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>

Sprawdź dane wyjściowe

Ponieważ ścieżka lokalizacji określa lokalizację węzła przy użyciu ścieżki bezwzględnej lub względnej, osie są używane do identyfikowania elementów na podstawie ich relacji parent, child, sibling, itd. Osie nazywane są tak, ponieważ odnoszą się do osi, na której leżą elementy względem elementu.

Poniżej znajduje się lista różnych wartości osi.

S.No. Oś i opis
1

ancestor

Reprezentuje przodków bieżącego węzła, który obejmuje rodziców aż do węzła głównego.

2

ancestor-or-self

Reprezentuje bieżący węzeł i jego przodków.

3

attribute

Reprezentuje atrybuty bieżącego węzła.

4

child

Reprezentuje elementy podrzędne bieżącego węzła.

5

descendant

Reprezentuje potomków bieżącego węzła. Potomkowie obejmują dzieci węzła do węzła liścia (nie ma więcej dzieci).

6

descendant-or-self

Reprezentuje bieżący węzeł i jego potomków.

7

following

Reprezentuje wszystkie węzły, które znajdują się po bieżącym węźle.

8

following-sibling

Reprezentuje następujące elementy równorzędne węzła kontekstu. Rodzeństwo jest na tym samym poziomie, co bieżący węzeł i ma wspólny węzeł.

9

namespace

Reprezentuje przestrzeń nazw bieżącego węzła.

10

parent

Reprezentuje rodzica bieżącego węzła.

11

preceding

Reprezentuje wszystkie węzły, które znajdują się przed bieżącym węzłem (tj. Przed jego otwierającym tagiem).

12

self

Reprezentuje bieżący węzeł.

Poniżej znajduje się kilka przykładów wykorzystania osi.

firstname - wybierz imię związane z węzłami uczniów.

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

Przykład

W tym przykładzie utworzyliśmy przykładowy dokument XML students.xml i jego dokument arkusza stylów students.xsl który używa wyrażeń XPath.

Poniżej przedstawiono przykładowy używany kod XML.

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>

Sprawdź dane wyjściowe

W tym rozdziale zobaczymy szczegółowo operatory i funkcje XPath obejmujące często używane XPath defines i handles. XPath definiuje operatory i funkcje w typach węzłów, łańcuchów, liczb i wartości logicznych.

Poniżej znajduje się lista, o której będziemy rozmawiać.

S.No. Operatory / funkcje i opis
1 Operatory porównania

Operatory porównania do porównywania wartości.

2 Operatory boolowskie

Operatory logiczne do sprawdzania funkcji „i” lub „& nie”.

3 Funkcje liczbowe / operatory

Operatory / funkcje na liczbach.

4 Funkcje łańcuchowe

Różne funkcje tekstowe.

5 Funkcje / operatory węzła

Różne funkcje i operatory działające na węzłach.

XPath definiuje następujące symbole wieloznaczne na węzłach, które mają być używane z wyrażeniami XPath.

S.No. Dzika karta i opis
1

*

używany do dopasowania dowolnego węzła.

2

.

używany do dopasowania bieżącego węzła w kontekście.

3

@*

używany do dopasowania dowolnego atrybutu

4

node()

używany do dopasowywania węzłów dowolnego typu

Przykład

Ten przykład tworzy tabelę elementu <student> z ich szczegółami, wykonując iterację po każdym uczniu.

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>

Sprawdź dane wyjściowe

Predykat odnosi się do wyrażenia XPath zapisanego w nawiasach kwadratowych. Odnosi się do ograniczenia wybranych węzłów w zestawie węzłów pod pewnymi warunkami. Na przykład,

S.No. Predykat i opis
1

/class/student[1]

Wybierz pierwszy element ucznia, który jest dzieckiem elementu klasy.

2

/class/student[last()]

Wybierz ostatni element ucznia, który jest dzieckiem elementu klasy.

3

/class/student[@rolllno = 493]

Wybierz element studenta z rolką 493.

4

/class/student[marks>85]

Wybierz element ucznia z ocenami> 85.

Przykład

Ten przykład tworzy tabelę elementu <student> z ich szczegółami, wykonując iterację po każdym uczniu. Oblicza położenie węzła ucznia, a następnie drukuje dane ucznia (ów) wraz z numerem seryjnym.

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>

Sprawdź dane wyjściowe