我正在使用 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 特定的错误/问题。
编辑: 正如我在下面的评论中指出的,以及 this SO Answer 中指出的,这个问题显然已在 Postgresql 9.2 中得到解决。该答案指出:
在 PostgreSQL 9.2 中,文档突然多了一句话涵盖 xpath 函数:
如果 XPath 表达式返回标量值而不是节点集,则返回单元素数组。
正是我需要的!因此,关于这个问题,另一个有效的答案是:升级到 PostgreSQL 9.2。
以下是我原来的答案的其余部分:
这似乎是 Postgresql 的
xpath()
函数中的一个已知限制 - 只有计算为节点集的表达式才会返回任何内容;返回标量值的 XPath 表达式仅返回空数组。
一些谷歌搜索揭示了大约 2 年前关于此问题的一些讨论,主要来自一个名叫 Florian Pflug 的人:
他开发了一个补丁,据说可以解决这个问题,并附加到以下线程(尽管我不完全确定这是最新版本):
http://www.postgresql.org/message-id/[电子邮件受保护]
似乎确实有一些关于他的补丁的优缺点的讨论,所以我建议阅读这些线程以了解所涉及的内容:
http://www.postgresql.org/message-id/[电子邮件受保护] http://www.postgresql.org/message-id/[电子邮件受保护]
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)