Перейти к основному содержимому

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