PostgreSQL XPath 中是否实现了 XPath sum 或 fn:sum 函数?

发布于 2024-10-14 09:21:12 字数 787 浏览 2 评论 0原文

我正在使用 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']]);

这工作正常,它返回使用 "value>15" 条件正确过滤的节点列表:

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

但是当我尝试使用 "sum" 它返回一个空列表而不是标量值

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

结果:

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

有什么建议吗?

胡安·费雷拉

I'm using PostgreSQL 8.4 XPath (XML functions) feature. This is an adapted example found in docs:

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']]);

This works fine, it returns a list of nodes correctly filtered with "value>15" condition:

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

But when I try to use "sum" it returns an empty list instead of a scalar value:

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

result:

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

Any suggestions?

Juan Ferreyra

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

并安 2024-10-21 09:21:13

我偶然发现了同样的问题,我很高兴为该问题添加另一个答案:

使用 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)

I stumbled across the same problem and I am pleased to add another answer to the question:

With PostgreSQL 9.2 the documentation suddenly has one more sentence covering the xpath function:

If the XPath expression returns a scalar value rather than a node set,
a single-element array is returned.

Just what I need! So in relation to the question another valid answer is: Upgrade to PostgreSQL 9.2. In the moment of writing this, version 9.2 is just a beta, but I can confirm that this works:

Version details

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)

Demonstration of solution

(This demonstration was made with Postgre 9.5, because originally I pasted the wrong code)

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)
2024-10-21 09:21:13

xpath 不会创建新节点,它只会过滤当前存在的节点。这就是 XSLT 的用途。

来自文档

函数xpath根据XML值xml计算XPath表达式xpath。它返回与 XPath 表达式生成的节点集相对应的 XML 值数组。

由于您的 XPath 表达式不返回节点集,因此其中没有值,也没有任何可返回的内容。

xpath does not create new nodes, it only filters the currently existing ones. That's what XSLT is for.

From the docs:

The function xpath evaluates the XPath expression xpath against the XML value xml. It returns an array of XML values corresponding to the node set produced by the XPath expression.

Since your XPath expression does not return a node set, there are not values in it and there is nothing to return.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文