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