xml2. Функции для выполнения запросов XPath и преобразований XSLT#

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

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

Доработка#

Доработка не проводилась.

Ограничения#

Ограничения отсутствуют.

Установка#

При наличии прав администратора СУБД включение модуля выполняется запросом:

CREATE EXTENSION xml2 SCHEMA ext;

Настройка#

Настройка не требуется.

Использование модуля#

Подробное описание функций, которые предоставляются модулем xml2, приведены в документации: https://www.postgresql.org/docs/15/xml2.html.

Ниже рассмотрены примеры работы с функцией xpath_table, которая рассчитана на случаи, когда каждый запрос XPath может вернуть набор данных. Количество возвращенных этой функцией строк может не совпадать с количеством входных документов. В первой строке возвращается первый результат каждого запроса, во второй — второй результат и так далее. Если один из запросов возвращает меньше значений, чем другие, вместо недостающих значений будет возвращаться NULL.

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

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

Пример:

CREATE TABLE test (
    id int PRIMARY KEY,
    xml text
);
INSERT INTO test VALUES (1, '<doc num="C1">
<line num="L1"><a>1</a><b>2</b><c>3</c></line>
<line num="L2"><a>11</a><b>22</b><c>33</c></line>
</doc>');
INSERT INTO test VALUES (2, '<doc num="C2">
<line num="L1"><a>111</a><b>222</b><c>333</c></line>
<line num="L2"><a>111</a><b>222</b><c>333</c></line>
</doc>');
SELECT * FROM
  xpath_table('id','xml','test',
              '/doc/@num|/doc/line/@num|/doc/line/a|/doc/line/b|/doc/line/c',
              'true')
  AS t(id int, doc_num varchar(10), line_num varchar(10), val1 int, val2 int, val3 int)
WHERE id = 1 ORDER BY doc_num, line_num;

Пример вывода результата выполнения запроса:

 id | doc_num | line_num | val1 | val2 | val3 
----+---------+----------+------+------+------
  1 | C1      | L1       |    1 |    2 |    3
  1 |         | L2       |   11 |   22 |   33
(2 rows)

Чтобы получить doc_num в каждой строке, можно вызывать xpath_table дважды и соединить результаты:

SELECT t.*,i.doc_num FROM
  xpath_table('id', 'xml', 'test',
              '/doc/line/@num|/doc/line/a|/doc/line/b|/doc/line/c',
              'true')
    AS t(id int, line_num varchar(10), val1 int, val2 int, val3 int),
  xpath_table('id', 'xml', 'test', '/doc/@num', 'true')
    AS i(id int, doc_num varchar(10))
WHERE i.id=t.id AND i.id=1
ORDER BY doc_num, line_num;

Пример вывода результата выполнения запроса:

 id | line_num | val1 | val2 | val3 | doc_num 
----+----------+------+------+------+---------
  1 | L1       |    1 |    2 |    3 | C1
  1 | L2       |   11 |   22 |   33 | C1
(2 rows)

Ссылки на документацию разработчика#

Исходная документация PosgreSQL по модулю xml2: https://www.postgresql.org/docs/15/xml2.html