XPath - Краткое руководство

Прежде чем изучать XPath, мы должны сначала понять XSL, что означает Eрастяжимый Sтаблица Lболь. Он похож на XML, как CSS на HTML.

Потребность в XSL

В случае документов HTML предопределены теги, такие как table, div, span и т. Д. Браузер знает, как добавлять к ним стиль и отображать их с помощью стилей CSS. Но в случае XML-документов теги не определены заранее. Чтобы понять и стилизовать XML-документ,World Wide Web Consortium (W3C)разработан XSL, который может действовать как язык таблиц стилей на основе XML. Документ XSL определяет, как браузер должен отображать документ XML.

Ниже приведены основные части XSL -

  • XSLT - используется для преобразования XML-документов в различные другие типы документов.

  • XPath - используется для навигации по XML-документам.

  • XSL-FO - используется для форматирования XML-документов.

Что такое XPath?

XPath - это официальная рекомендация Консорциума World Wide Web (W3C). Он определяет язык для поиска информации в XML-файле. Он используется для просмотра элементов и атрибутов XML-документа. XPath предоставляет различные типы выражений, которые можно использовать для запроса соответствующей информации из XML-документа.

  • Structure Definitions - XPath определяет части XML-документа, такие как элемент, атрибут, текст, пространство имен, инструкция обработки, комментарий и узлы документа.

  • Path Expressions - XPath предоставляет мощные выражения пути для выбора узлов или списка узлов в XML-документах.

  • Standard Functions - XPath предоставляет богатую библиотеку стандартных функций для манипулирования строковыми значениями, числовыми значениями, сравнения даты и времени, манипулирования узлами и QName, манипуляциями с последовательностями, логическими значениями и т. Д.

  • Major part of XSLT - XPath - один из основных элементов стандарта XSLT, и для работы с документами XSLT он должен обладать знаниями.

  • W3C recommendation - XPath - это официальная рекомендация Консорциума World Wide Web (W3C).

При работе с XPath следует иметь в виду следующие моменты:

  • XPath - это основной компонент стандарта XSLT .
  • XSLT не может работать без XPath.
  • XPath - это основа XQuery и XPointer.

Выражение XPath обычно определяет шаблон для выбора набора узлов. Эти шаблоны используются XSLT для выполнения преобразований или XPointer для адресации.

Спецификация XPath определяет семь типов узлов, которые могут быть результатом выполнения выражения XPath.

  • Root
  • Element
  • Text
  • Attribute
  • Comment
  • Инструкция по обработке
  • Namespace

XPath использует выражение пути для выбора узла или списка узлов из XML-документа.

Ниже приведен список полезных путей и выражения для выбора любого узла / списка узлов из XML-документа.

S.No. Выражение и описание
1

node-name

Выберите все узлы с заданным именем "nodename"

2

/

Выбор начинается с корневого узла

3

//

Выделение начинается с текущего узла, соответствующего выделению

4

.

Выбирает текущий узел

5

..

Выбирает родителя текущего узла

6

@

Выбирает атрибуты

7

student

Пример - выбираются все узлы с именем «студент».

8

class/student

Пример - выбирает все элементы учеников, которые являются дочерними элементами класса.

9

//student

Выбирает все элементы ученика независимо от того, где они находятся в документе

пример

В этом примере мы создали образец XML-документа student.xml и его документ таблицы стилей. students.xsl который использует выражения XPath под select атрибут различных XSL-тегов для получения значений номера списка, имени, фамилии, псевдонима и оценок каждого узла учащегося.

student.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>

student.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>

Проверьте вывод

В этой главе мы подробно рассмотрим выражение XPath, охватывающее общие типы узлов, которые XPath определяет и обрабатывает.

S.No. Тип и описание узла
1 Корень

Узел корневого элемента XML-документа.

2 Элемент

Узел элемента.

3 Текст

Текст узла элемента.

4 Атрибут

Атрибут узла элемента.

5 Комментарий

Комментарий

Путь к расположению указывает расположение узла в XML-документе. Этот путь может быть абсолютным или относительным. Если путь к местоположению начинается с корневого узла или с '/', то это абсолютный путь. Ниже приведены несколько примеров размещения элементов с использованием абсолютного пути.

/class/student - выберите узлы учеников в корневом узле класса.

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

/class/student/firstname - выберите имя студента в корневом узле класса.

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

пример

В этом примере мы создали образец XML-документа. students.xml и его документ таблицы стилей students.xsl который использует выражения XPath.

Ниже приводится образец используемого XML.

student.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>

student.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>

Проверьте вывод

Путь к расположению указывает расположение узла в XML-документе. Этот путь может быть абсолютным или относительным. Если путь местоположения начинается с выбранного нами узла, то это относительный путь.

Ниже приведены несколько примеров размещения элементов с использованием относительного пути.

firstname - выберите имя, относящееся к студенческим узлам.

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

пример

В этом примере мы создали образец XML-документа. students.xml и его документ таблицы стилей students.xsl который использует выражения XPath.

Ниже приводится образец используемого XML.

student.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>

student.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>

Проверьте вывод

Поскольку путь местоположения определяет местоположение узла с использованием абсолютного или относительного пути, оси используются для идентификации элементов по их взаимосвязи, например parent, child, sibling, и т. д. Оси названы так, потому что они относятся к оси, на которой элементы лежат относительно элемента.

Ниже приведен список различных значений оси.

S.No. Ось и описание
1

ancestor

Представляет предков текущего узла, включая родителей до корневого узла.

2

ancestor-or-self

Представляет текущий узел и его предков.

3

attribute

Представляет атрибуты текущего узла.

4

child

Представляет дочерние элементы текущего узла.

5

descendant

Представляет потомков текущего узла. Потомки включают детей от узла до конечного узла (без детей).

6

descendant-or-self

Представляет текущий узел и его потомков.

7

following

Представляет все узлы, следующие за текущим узлом.

8

following-sibling

Представляет следующих братьев и сестер контекстного узла. Братья и сестры находятся на том же уровне, что и текущий узел, и разделяют его родительский элемент.

9

namespace

Представляет пространство имен текущего узла.

10

parent

Представляет родителя текущего узла.

11

preceding

Представляет все узлы, которые идут перед текущим узлом (то есть до его открывающего тега).

12

self

Представляет текущий узел.

Ниже приведены несколько примеров использования топоров.

firstname - выберите имя, относящееся к студенческим узлам.

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

пример

В этом примере мы создали образец XML-документа. students.xml и его документ таблицы стилей students.xsl который использует выражения XPath.

Ниже приводится образец используемого XML.

student.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>

student.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>

Проверьте вывод

В этой главе мы подробно рассмотрим операторы и функции XPath, охватывающие наиболее часто используемые XPath. defines и handles. XPath определяет операторы и функции для типов узлов, строк, чисел и логических типов.

Ниже приводится список, который мы собираемся обсудить.

S.No. Операторы / Функции и описание
1 Операторы сравнения

Операторы сравнения для сравнения значений.

2 Булевы операторы

Булевы операторы для проверки функциональности «и», «и».

3 Числовые функции / операторы

Операторы / Функции на числах.

4 Строковые функции

Различные строковые функции.

5 Функции / операторы узла

Различные функции и операторы, действующие на узлы.

XPath определяет следующие подстановочные знаки на узлах, которые будут использоваться с выражениями XPath.

S.No. Подстановочный знак и описание
1

*

используется для соответствия любому узлу.

2

.

используется для сопоставления текущего узла в контексте.

3

@*

используется для соответствия любому атрибуту

4

node()

используется для сопоставления узла любого типа

пример

В этом примере создается таблица элементов <student> с их подробностями путем итерации по каждому учащемуся.

student.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>

student.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>

Проверьте вывод

Предикат относится к выражению XPath, записанному в квадратных скобках. Это относится к ограничению выбранных узлов в наборе узлов для некоторого условия. Например,

S.No. Предикат и описание
1

/class/student[1]

Выберите первый элемент ученика, который является потомком элемента класса.

2

/class/student[last()]

Выберите последний элемент ученика, который является дочерним по отношению к элементу класса.

3

/class/student[@rolllno = 493]

Выберите элемент ученика с помощью rollno 493.

4

/class/student[marks>85]

Выберите элемент ученика с оценками> 85.

пример

В этом примере создается таблица элементов <student> с их подробностями путем итерации по каждому учащемуся. Он вычисляет положение узла студента, а затем распечатывает детали студента (ов) вместе с серийным номером.

student.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>

student.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>

Проверьте вывод