Функция XPath sum или fn: sum реализована в PostgreSQL XPath? - PullRequest
3 голосов
/ 25 января 2011

Я использую PostgreSQL 8.4 XPath (функции XML) .Это адаптированный пример, найденный в документации:

SELECT xpath('/my:a/value[.>15]',
'<my:a xmlns:my="http://example.com">
<value>20</value>
<value>10</value>
<value>30</value>
</my:a>',
ARRAY[ARRAY['my', 'http://example.com']]);

Работает нормально, возвращает список узлов, правильно отфильтрованных с "значением> 15" условие:

xpath  
xml[]  
---------------------------------------  
"{<value>20</value>,<value>30</value>}"

Но когда я пытаюсь использовать "sum" , вместо скалярного значения возвращается пустой список :

SELECT xpath('sum(/my:a/value[.>15])',  
...

result:

xpath  
xml[]  
-----  
"{}"

Есть предложения?

Хуан Феррейра

Ответы [ 2 ]

1 голос
/ 22 мая 2012

Я наткнулся на ту же проблему, и я рад добавить еще один ответ на вопрос:

В PostgreSQL 9.2 в документации неожиданно появилось еще одно предложение, охватывающее функцию xpath:

Если выражение XPath возвращает скалярное значение, а не набор узлов, возвращается одноэлементный массив.

Как раз то, что мне нужно! Таким образом, в отношении вопроса другой правильный ответ: Обновление до PostgreSQL 9.2. На момент написания этой статьи версия 9.2 является только бета-версией, но я могу подтвердить, что она работает:

Информация о версии

postgres=# select version();
                                                     version                                                      
------------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.2beta1 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52), 64-bit
(1 row)

Демонстрация решения

(эта демонстрация была сделана с Postgre 9.5, потому что изначально я вставил неправильный код)

postgres=# SELECT xpath('sum(/my:a/value[.>15])', '<my:a xmlns:my="http://example.com">
postgres'# <value>20</value>
postgres'# <value>10</value>
postgres'# <value>30</value>
postgres'# </my:a>',
postgres(# ARRAY[ARRAY['my', 'http://example.com']]);
 xpath 
-------
 {50}
(1 row)
0 голосов
/ 25 января 2011

xpath не создает новые узлы, а только фильтрует существующие.Вот для чего XSLT.

Из документов :

Функция xpath вычисляет выражение XPath xpath против значения XML xml.Он возвращает массив значений XML, соответствующих набору узлов, созданному выражением XPath.

Поскольку ваше выражение XPath не возвращает набор узлов, в нем нет значений и возвращать нечего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...