Учебники

XQuery – Краткое руководство

XQuery – Обзор

XQuery – это функциональный язык, который используется для извлечения информации, хранящейся в формате XML. XQuery может использоваться для документов XML, реляционных баз данных, содержащих данные в форматах XML, или баз данных XML. XQuery 3.0 является рекомендацией W3C от 8 апреля 2014 года.

Определение XQuery, приведенное в его официальной документации, следующее:

XQuery – это стандартизированный язык для объединения документов, баз данных, веб-страниц и почти всего остального. Это очень широко реализовано. Это мощный и простой в освоении. XQuery заменяет проприетарные языки промежуточного программного обеспечения и языки разработки веб-приложений. XQuery заменяет сложные программы на Java или C ++ несколькими строками кода. С XQuery проще работать и легче поддерживать, чем со многими другими альтернативами.

Характеристики

  • Функциональный язык – XQuery – это язык для извлечения / запроса данных на основе XML.

  • По аналогии с SQL – XQuery для XML – это то же самое, что SQL для баз данных.

  • На основе XPath – XQuery использует выражения XPath для навигации по документам XML.

  • Общепринятый – XQuery поддерживается всеми основными базами данных.

  • Стандарт W3C – XQuery является стандартом W3C.

Функциональный язык – XQuery – это язык для извлечения / запроса данных на основе XML.

По аналогии с SQL – XQuery для XML – это то же самое, что SQL для баз данных.

На основе XPath – XQuery использует выражения XPath для навигации по документам XML.

Общепринятый – XQuery поддерживается всеми основными базами данных.

Стандарт W3C – XQuery является стандартом W3C.

Преимущества XQuery

  • Используя XQuery, можно получать как иерархические, так и табличные данные.

  • XQuery может быть использован для запроса дерева и графических структур.

  • XQuery может быть непосредственно использован для запроса веб-страниц.

  • XQuery может быть непосредственно использован для создания веб-страниц.

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

  • XQuery идеально подходит для баз данных на основе XML и баз данных на основе объектов. Объектные базы данных гораздо более гибкие и мощные, чем просто табличные базы данных.

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

XQuery может быть использован для запроса дерева и графических структур.

XQuery может быть непосредственно использован для запроса веб-страниц.

XQuery может быть непосредственно использован для создания веб-страниц.

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

XQuery идеально подходит для баз данных на основе XML и баз данных на основе объектов. Объектные базы данных гораздо более гибкие и мощные, чем просто табличные базы данных.

XQuery – настройка среды

В этой главе рассказывается, как настроить библиотеку XQuery в локальной среде разработки.

Мы используем автономный процессор XQuery с открытым исходным кодом Saxon Home Edition (Saxon-HE), который широко используется. Этот процессор поддерживает XSLT 2.0, XQuery 3.0 и XPath 3.0 и высоко оптимизирован для производительности. Процессор Saxon XQuery можно использовать без использования базы данных XML. Мы будем использовать простой XML-документ в качестве нашей базы данных в наших примерах.

Чтобы использовать процессор Saxon XQuery, вы должны иметь saxon9he.jar, saxon9-test.jar, saxon9-unpack, saxon9-xqj.jar в пути к классам вашего приложения. Эти файлы JAR доступны в файле загрузки SaxonHE9-6-0-1J.zip Скачать SaxonHE9-6-0-1J.zip .

пример

Мы будем использовать процессор Saxon XQuery на основе Java для тестирования файла books.xqy, содержащего выражение XQuery, в нашем примере XML-документа, т.е. books.xml.

В этом примере мы увидим, как написать и обработать запрос, чтобы получить титульные элементы книг, цена которых превышает 30.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

books.xqy

for $x in doc("books.xml")/books/book
where $x/price>30
return $x/title

XQueryTester.java

package com.tutorialspoint.xquery;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultSequence;

import com.saxonica.xqj.SaxonXQDataSource;

public class XQueryTester {
   public static void main(String[] args){
      try {
         execute();
      }
      
      catch (FileNotFoundException e) {
         e.printStackTrace();
      }
      
      catch (XQException e) {
         e.printStackTrace();
      }
   }

   private static void execute() throws FileNotFoundException, XQException{
      InputStream inputStream = new FileInputStream(new File("books.xqy"));
      XQDataSource ds = new SaxonXQDataSource();
      XQConnection conn = ds.getConnection();
      XQPreparedExpression exp = conn.prepareExpression(inputStream);
      XQResultSequence result = exp.executeQuery();
      
      while (result.next()) {
         System.out.println(result.getItemAsString(null));
      }
   }	
}

Шаги для выполнения XQuery против XML

  • Шаг 1 – Скопируйте XQueryTester.java в любое место, скажем, E: > java

  • Шаг 2 – Скопируйте books.xml в то же место, E: > Java

  • Шаг 3 – Скопируйте books.xqy в то же место, E: > Java

  • Шаг 4 – Скомпилируйте XQueryTester.java с помощью консоли. Убедитесь, что на вашем компьютере установлен JDK 1.5 или более поздней версии и настроены пути к классам. Подробнее о том, как использовать JAVA, смотрите наш учебник по JAVA.

Шаг 1 – Скопируйте XQueryTester.java в любое место, скажем, E: > java

Шаг 2 – Скопируйте books.xml в то же место, E: > Java

Шаг 3 – Скопируйте books.xqy в то же место, E: > Java

Шаг 4 – Скомпилируйте XQueryTester.java с помощью консоли. Убедитесь, что на вашем компьютере установлен JDK 1.5 или более поздней версии и настроены пути к классам. Подробнее о том, как использовать JAVA, смотрите наш учебник по JAVA.

E:\java\javac XQueryTester.java
  • Шаг 5 – Выполнить XQueryTester

Шаг 5 – Выполнить XQueryTester

E:\java\java XQueryTester

Выход

Вы получите следующий результат –

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Понимание примера

  • books.xml представляет пример данных.

  • books.xqy представляет выражение XQuery, которое должно быть выполнено в books.xml. Мы разберем это выражение в следующей главе.

  • XQueryTester, основанная на Java программа-исполнитель XQuery, считывает books.xqy, передает ее процессору выражений XQuery и выполняет выражение. Затем результат печатается.

books.xml представляет пример данных.

books.xqy представляет выражение XQuery, которое должно быть выполнено в books.xml. Мы разберем это выражение в следующей главе.

XQueryTester, основанная на Java программа-исполнитель XQuery, считывает books.xqy, передает ее процессору выражений XQuery и выполняет выражение. Затем результат печатается.

XQuery – первое приложение

пример

Ниже приведен пример XML-документа, содержащего записи книжного магазина различных книг.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

Ниже приведен пример документа Xquery, содержащий выражение запроса, которое должно быть выполнено в вышеуказанном XML-документе. Цель состоит в том, чтобы получить элементы заголовка тех узлов XML, цена которых превышает 30.

books.xqy

for $x in doc("books.xml")/books/book
where $x/price>30
return $x/title

Результат

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Проверить результат

Чтобы проверить результат, замените содержимое файла books.xqy (приведенного в главе « Настройка среды» ) приведенным выше выражением XQuery и выполните Java-программу XQueryTester.

Выражения XQuery

Давайте разберемся с каждой частью вышеприведенного выражения XQuery.

Использование функций

doc("books.xml")

doc () – это одна из функций XQuery, которая используется для поиска источника XML. Здесь мы передали “books.xml”. Учитывая относительный путь, books.xml должен лежать на том же пути, где присутствует books.xqy.

Использование выражений XPath

doc("books.xml")/books/book

XQuery интенсивно использует выражения XPath для поиска необходимой части XML, по которой должен выполняться поиск. Здесь мы выбрали все узлы книг, доступные под узлом книг.

Итерировать объекты

for $x in doc("books.xml")/books/book

XQuery рассматривает данные XML как объекты. В приведенном выше примере $ x представляет выбранный узел, а цикл for выполняет итерацию по совокупности узлов.

Применить условие

where $x/price>30

Поскольку $ x представляет выбранный узел, «/» используется для получения значения требуемого элемента; Предложение “where” используется для наложения условия на результаты поиска.

Вернуть результат

return $x/title

Поскольку $ x представляет выбранный узел, «/» используется для получения значения требуемого элемента, цены, заголовка; Предложение return используется для возврата элементов из результатов поиска.

XQuery – FLWOR

FLWOR – это аббревиатура, обозначающая «За, Позвольте, Где, Сортировать, Вернуть». В следующем списке показано, что они учитывают в выражении FLWOR –

  • F – For – Выбирает коллекцию всех узлов.

  • L – Let – Помещает результат в переменную XQuery.

  • W – Где – Выбирает узлы, указанные условием.

  • O – Упорядочить по – Упорядочивает узлы, указанные в соответствии с критериями.

  • R – Return – возвращает окончательный результат.

F – For – Выбирает коллекцию всех узлов.

L – Let – Помещает результат в переменную XQuery.

W – Где – Выбирает узлы, указанные условием.

O – Упорядочить по – Упорядочивает узлы, указанные в соответствии с критериями.

R – Return – возвращает окончательный результат.

пример

Ниже приведен пример XML-документа, который содержит информацию о коллекции книг. Мы будем использовать выражение FLWOR для получения названий тех книг, цена которых превышает 30.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

Следующий документ Xquery содержит выражение запроса, которое будет выполнено в приведенном выше XML-документе.

books.xqy

let $books := (doc("books.xml")/books/book)
return <results>
{
   for $x in $books
   where $x/price>30
   order by $x/price
   return $x/title
}
</results>

Результат

<title lang="en">Learn XQuery in 24 hours</title>
<title lang="en">Learn .Net in 24 hours</title>

Проверить результат

Чтобы проверить результат, замените содержимое файла books.xqy (приведенного в главе « Настройка среды» ) приведенным выше выражением XQuery и выполните Java-программу XQueryTester.

XQuery – формат HTML

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

пример

Мы будем использовать тот же файл books.xml. В следующем примере XQuery извлекает данные из books.xml и создает таблицу HTML, содержащую названия всех книг и соответствующие цены.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

Ниже приведено выражение Xquery, которое должно быть выполнено в приведенном выше XML-документе.

books.xqy

let $books := (doc("books.xml")/books/book)
return <table><tr><th>Title</th><th>Price</th></tr>
{
   for $x in $books   
   order by $x/price
   return <tr><td>{data($x/title)}</td><td>{data($x/price)}</td></tr>
}
</table>
</results>

Результат

<table>
   <tr>
      <th>Title</th>
      <th>Price</th>
   </tr>
   <tr>
      <td>Learn XPath in 24 hours</td>
      <td>16.50</td>
   </tr>   
   <tr>
      <td>Learn Java in 24 Hours</td>
      <td>30.00</td>
   </tr>
   <tr>
      <td>Learn XQuery in 24 hours</td>
      <td>50.00</td>
   </tr>   
   <tr>
      <td>Learn .Net in 24 hours</td>
      <td>70.50</td>
   </tr>
</table>

Проверить результат

Чтобы проверить результат, замените содержимое файла books.xqy (приведенного в главе « Настройка среды» ) приведенным выше выражением XQuery и выполните Java-программу XQueryTester.

Выражения XQuery

Здесь мы использовали следующие выражения XQuery –

  • функция data () для оценки значения элемента title и

  • {} оператор, чтобы сказать процессору XQuery рассматривать data () как функцию. Если оператор {} не используется, то data () будет обрабатываться как обычный текст.

функция data () для оценки значения элемента title и

{} оператор, чтобы сказать процессору XQuery рассматривать data () как функцию. Если оператор {} не используется, то data () будет обрабатываться как обычный текст.

XQuery – XPath

XQuery совместим с XPath. Он использует выражения XPath для ограничения результатов поиска в коллекциях XML. Для получения более подробной информации о том, как использовать XPath, см. Наш учебник XPath .

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

doc("books.xml")/books/book

Примеры XPath

Мы будем использовать файл books.xml и применим к нему XQuery.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

Мы привели здесь три версии оператора XQuery, которые выполняют одну и ту же задачу – отображать названия книг, стоимость которых превышает 30.

XQuery – версия 1

(: read the entire xml document 🙂
let $books := doc("books.xml")

for $x in $books/books/book
where $x/price > 30
return $x/title

Выход

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

XQuery – версия 2

(: read all books 🙂
let $books := doc("books.xml")/books/book

for $x in $books
where $x/price > 30
return $x/title

Выход

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

XQuery – версия 3

(: read books with price > 30 🙂
let $books := doc("books.xml")/books/book[price > 30]

for $x in $books
return $x/title

Выход

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Проверьте результат

Чтобы проверить результат, замените содержимое файла books.xqy (приведенного в главе « Настройка среды» ) приведенным выше выражением XQuery и выполните Java-программу XQueryTester.

XQuery – последовательности

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

Создание последовательности

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

XQuery Expression

let $items := ('orange', <apple/>, <fruit type="juicy"/>, <vehicle type="car">sentro</vehicle>, 1,2,3,'a','b',"abc")
let $count := count($items)
return
<result>
   <count>{$count}</count>
   
   <items>
      {
	     for $item in $items
         return <item>{$item}</item>
      }
   </items>
   
</result>

Выход

<result>
   <count>10</count>
   <items>
      <item>orange</item>
      <item>
         <apple/>
      </item>
      <item>
         <fruit type="juicy"/>
      </item>
      <item>
         <vehicle type="car">Sentro</vehicle>
      </item>
      <item>1</item>
      <item>2</item>
      <item>3</item>
      <item>a</item>
      <item>b</item>
      <item>abc</item>
   </items>
</result>

Просмотр элементов последовательности

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

Выражение XQuery (Индекс)

let $items := (1,2,3,4,5,6)
let $count := count($items)
return
   <result>
      <count>{$count}</count>
      
      <items>
      {
         for $item in $items[2]
         return <item>{$item}</item>
      }
      </items>
      
   </result>

Выход

<result>
   <count>6</count>
   <items>
      <item>2</item>
   </items>
</result>

Выражение XQuery (Значение)

let $items := (1,2,3,4,5,6)
let $count := count($items)
return
   <result>
      <count>{$count}</count>
      
      <items>
      {
         for $item in $items[. = (1,2,3)]
         return <item>{$item}</item>
      }
      </items>
      
   </result>

Выход

<result>
   <count>6</count>
   <items>
      <item>1</item>
      <item>2</item>
      <item>3</item>
   </items>
</result>

XQuery – функции последовательности

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

Sr.No Имя и описание
1

считать ($ seq как элемент () *)

Считает предметы в последовательности.

2

сумма ($ seq как элемент () *)

Возвращает сумму элементов в последовательности.

3

avg ($ seq as item () *)

Возвращает среднее значение элементов в последовательности.

4

мин ($ seq как элемент () *)

Возвращает минимальный элемент в последовательности.

5

max ($ seq как item () *)

Возвращает максимальный элемент в последовательности.

6

Отличительные значения ($ seq как item () *)

Возвращает выбранные отдельные элементы из последовательности.

7

подпоследовательность ($ seq как item () *, $ startLoc как xs: double, $ length как xs: double)

Возвращает подмножество предоставленной последовательности.

8

insert-before ($ seq как item () *, $ position как xs: integer, $ inserts как item () *)

Вставляет элемент в последовательность.

9

удалить ($ seq как item () *, $ position как xs: integer)

Удаляет элемент из последовательности.

10

реверс ($ seq как item () *)

Возвращает обратную последовательность.

11

index-of ($ seq as anyAtomicType () *, $ target как anyAtomicType ())

Возвращает индексы в виде целых чисел, указывающих на доступность элемента в последовательности.

12

прошлой()

Возвращает последний элемент последовательности при использовании в выражении предиката.

13

позиция()

Используется в выражениях FLOWR для получения позиции элемента в последовательности.

считать ($ seq как элемент () *)

Считает предметы в последовательности.

сумма ($ seq как элемент () *)

Возвращает сумму элементов в последовательности.

avg ($ seq as item () *)

Возвращает среднее значение элементов в последовательности.

мин ($ seq как элемент () *)

Возвращает минимальный элемент в последовательности.

max ($ seq как item () *)

Возвращает максимальный элемент в последовательности.

Отличительные значения ($ seq как item () *)

Возвращает выбранные отдельные элементы из последовательности.

подпоследовательность ($ seq как item () *, $ startLoc как xs: double, $ length как xs: double)

Возвращает подмножество предоставленной последовательности.

insert-before ($ seq как item () *, $ position как xs: integer, $ inserts как item () *)

Вставляет элемент в последовательность.

удалить ($ seq как item () *, $ position как xs: integer)

Удаляет элемент из последовательности.

реверс ($ seq как item () *)

Возвращает обратную последовательность.

index-of ($ seq as anyAtomicType () *, $ target как anyAtomicType ())

Возвращает индексы в виде целых чисел, указывающих на доступность элемента в последовательности.

прошлой()

Возвращает последний элемент последовательности при использовании в выражении предиката.

позиция()

Используется в выражениях FLOWR для получения позиции элемента в последовательности.

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

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

Sr.No Имя и описание
1

длина строки ($ string как xs: string) как xs: integer

Возвращает длину строки.

2

concat ($ input как xs: anyAtomicType?) как xs: string

Возвращает объединенную строку в качестве вывода.

3

string-join ($ sequence как xs: строка *, $ delimiter как xs: строка) как xs: строка

Возвращает комбинацию элементов в последовательности, разделенных разделителем.

длина строки ($ string как xs: string) как xs: integer

Возвращает длину строки.

concat ($ input как xs: anyAtomicType?) как xs: string

Возвращает объединенную строку в качестве вывода.

string-join ($ sequence как xs: строка *, $ delimiter как xs: строка) как xs: строка

Возвращает комбинацию элементов в последовательности, разделенных разделителем.

XQuery – функции даты

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

Sr.No Имя и описание
1

текущая дата()

Возвращает текущую дату.

2

Текущее время()

Возвращает текущее время.

3

Ток-DateTime ()

Возвращает как текущую дату, так и текущее время.

текущая дата()

Возвращает текущую дату.

Текущее время()

Возвращает текущее время.

Ток-DateTime ()

Возвращает как текущую дату, так и текущее время.

XQuery – Регулярные выражения

Ниже приведен список часто используемых функций регулярных выражений, предоставляемых XQuery.

Sr.No Имя и описание
1

совпадения ($ input, $ regex)

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

2

заменить ($ input, $ regex, $ string)

Заменяет сопоставленную входную строку на заданную строку.

3

токенизировать ($ input, $ regex)

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

совпадения ($ input, $ regex)

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

заменить ($ input, $ regex, $ string)

Заменяет сопоставленную входную строку на заданную строку.

токенизировать ($ input, $ regex)

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

XQuery – Если Тогда Иное

XQuery предоставляет очень полезную конструкцию if-then-else для проверки правильности переданных входных значений. Ниже приведен синтаксис конструкции if-then-else.

Синтаксис

if (condition) then
 ... 
else
 ... 

пример

Мы будем использовать следующий файл books.xml и применим к нему выражение XQuery, содержащее конструкцию if-then-else, чтобы получить названия этих книг со значением цены, превышающим 30.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author>
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
</books>

Следующее выражение XQuery должно быть применено к вышеуказанному документу XML.

books.xqy

<result>
{
   if(not(doc("books.xml"))) then (
      <error>
         <message>books.xml does not exist</message>
      </error>
   )
   else ( 
      for $x in doc("books.xml")/books/book	
      where $x/price>30
      return $x/title
   )
}
</result>

Выход

<result>
   <title lang="en">Learn .Net in 24 hours</title>
   <title lang="en">Learn XQuery in 24 hours</title>
</result>

Проверьте результат

Чтобы проверить результат, замените содержимое файла books.xqy (приведенного в главе « Настройка среды» ) приведенным выше выражением XQuery и выполните Java-программу XQueryTester.

XQuery – пользовательские функции

XQuery предоставляет возможность написания пользовательских функций. Ниже перечислены рекомендации по созданию пользовательских функций.

  • Используйте ключевое слово объявления функции, чтобы определить функцию.

  • Используйте типы данных, определенные в текущей XML-схеме

  • Заключите тело функции в фигурные скобки.

  • Префикс имени функции с пространством имен XML.

Используйте ключевое слово объявления функции, чтобы определить функцию.

Используйте типы данных, определенные в текущей XML-схеме

Заключите тело функции в фигурные скобки.

Префикс имени функции с пространством имен XML.

Следующий синтаксис используется при создании пользовательской функции.

Синтаксис

declare function prefix:function_name($parameter as datatype?...)
as returnDatatype?
{
   function body...
};

пример

В следующем примере показано, как создать пользовательскую функцию в XQuery.

XQuery Expression

declare function local:discount($price as xs:decimal?,$percentDiscount as xs:decimal?)
as xs:decimal? {
   let $discount := $price - ($price * $percentDiscount div 100) 
   return $discount
};

let $originalPrice := 100

let $discountAvailed := 10

return ( local:discount($originalPrice, $discountAvailed)) 

Выход

90

Проверьте результат

Чтобы проверить результат, замените содержимое файла books.xqy (приведенного в главе « Настройка среды» ) приведенным выше выражением XQuery и выполните Java-программу XQueryTester.