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>