SQL/XML 中的 XPath1,计数元素返回空

问题描述 投票:0回答:2

我正在使用 PostgreSQL 9,它采用 XPath-1 来实现 SQL/XML 标准 合规性。

这个查询没问题,返回了预期的数据:

 SELECT xpath('//img',xhtm) FROM t

但是另一个,要计算 img 元素,返回空(!),

 SELECT xpath('count(//img)',xhtm) FROM t

注意 1:

xhtm
字段内容示例,

 <html><p>Hello! <img src="1.png"/></p><img src="2.jpg"/></html>

NOTE 2:当然

array_length(xpath('//img',xhtm),1)
会显示计数结果,但它不是XPath计数。

注意 3:我不知道这是否是通用的 SQL/XML 特性,还是 PosgreSQL Server 9.0.5 特定的错误/问题。

postgresql xpath count sqlxml
2个回答
2
投票

编辑: 正如我在下面的评论中指出的,以及 this SO Answer 中指出的,这个问题显然已在 Postgresql 9.2 中得到解决。该答案指出:

在 PostgreSQL 9.2 中,文档突然多了一句话涵盖 xpath 函数:

如果 XPath 表达式返回标量值而不是节点集,则返回单元素数组。

正是我需要的!因此,关于这个问题,另一个有效的答案是:升级到 PostgreSQL 9.2。

以下是我原来的答案的其余部分:

这似乎是 Postgresql 的

xpath()
函数中的一个已知限制 - 只有计算为节点集的表达式才会返回任何内容;返回标量值的 XPath 表达式仅返回空数组。

一些谷歌搜索揭示了大约 2 年前关于此问题的一些讨论,主要来自一个名叫 Florian Pflug 的人:

http://postgresql.1045698.n5.nabble.com/PATCH-Bug-in-XPATH-if-expression-returns-a-scalar-value-td4440233.html


他开发了一个补丁,据说可以解决这个问题,并附加到以下线程(尽管我不完全确定这是最新版本):

http://www.postgresql.org/message-id/[电子邮件受保护]


似乎确实有一些关于他的补丁的优缺点的讨论,所以我建议阅读这些线程以了解所涉及的内容:

http://www.postgresql.org/message-id/[电子邮件受保护] http://www.postgresql.org/message-id/[电子邮件受保护]


2
投票

JLRishe 让我意识到你的问题。去年5月份我也遇到过同样的问题,我发现这个问题在PostgreSQL 9.2中已经修复了。

从9.2版本开始。文件指出:

如果 XPath 表达式返回标量值而不是节点集, 返回一个单元素数组。

我刚刚下载了 PostgreSQL 9.2 并运行了你的示例:

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

postgres=# SELECT xpath('count(//img)','<html><p>Hello! <img src="1.png"/></p><img src="2.jpg"/></html>'::xml);
 xpath 
-------
 {2}
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.