Postgresql XPath1在SQL/XML中,count元素返回空

Postgresql XPath1在SQL/XML中,count元素返回空,postgresql,xpath,count,sqlxml,Postgresql,Xpath,Count,Sqlxml,我在用,那是为顺从而采用的 此查询正常,返回预期数据: SELECT xpath('//img',xhtm) FROM t 但另一个用于计算img元素的函数返回空(!) 注1:axhtm字段内容样本 <html><p>Hello! <img src="1.png"/></p><img src="2.jpg"/></html> 你好 注2:当然array_length(xpath('//img',xhtml),1)

我在用,那是为顺从而采用的

此查询正常,返回预期数据:

 SELECT xpath('//img',xhtm) FROM t
但另一个用于计算img元素的函数返回空(!)


注1:a
xhtm
字段内容样本

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

注2:当然
array_length(xpath('//img',xhtml),1)
显示计数结果,但它不是xpath计数

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

编辑: 正如我在下面的评论中所指出的,正如中所指出的,这个问题显然在Postgresql 9.2中得到了解决。该答复指出:

在PostgreSQL 9.2中,文档突然又多了一句话,介绍了xpath函数:

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

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

以下是我最初回答的其余部分:

这似乎是Postgresql的
xpath()
函数中的一个已知限制-只有计算到节点集的表达式才能返回任何内容;返回标量值的XPath表达式只返回一个空数组

一些谷歌搜索揭示了大约两年前关于这一点的一些讨论,主要来自一位名叫Florian Pflug的人:


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


关于他的补丁的优缺点似乎有一些讨论,因此我建议通读这些帖子,了解其中涉及的内容:

编辑: 正如我在下面的评论中所指出的,正如中所指出的,这个问题显然在Postgresql 9.2中得到了解决。该答复指出:

在PostgreSQL 9.2中,文档突然又多了一句话,介绍了xpath函数:

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

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

以下是我最初回答的其余部分:

这似乎是Postgresql的
xpath()
函数中的一个已知限制-只有计算到节点集的表达式才能返回任何内容;返回标量值的XPath表达式只返回一个空数组

一些谷歌搜索揭示了大约两年前关于这一点的一些讨论,主要来自一位名叫Florian Pflug的人:


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


关于他的补丁的优缺点似乎有一些讨论,因此我建议通读这些帖子,了解其中涉及的内容:


jlRis她让我知道了你的问题。去年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)
postgres=#选择版本();
版本
---------------------------------------------------------------------------------------------------------------
x86_64-unknown-linux-gnu上的PostgreSQL 9.2.3,由gcc(gcc)4.1.2 20080704(Red Hat 4.1.2-52)编译,64位
(1排)
postgres=#选择xpath(/count(/img)”,Hello!

::xml); xpath ------- {2} (1排)
jlRis她让我知道了你的问题。去年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)
postgres=#选择版本();
版本
---------------------------------------------------------------------------------------------------------------
x86_64-unknown-linux-gnu上的PostgreSQL 9.2.3,由gcc(gcc)4.1.2 20080704(Red Hat 4.1.2-52)编译,64位
(1排)
postgres=#选择xpath(/count(/img)”,Hello!

::xml); xpath ------- {2} (1排)
您可以向我们展示您的XML内容吗?您可以向我们展示您的XML内容吗?嗯。。。好的,一个PostgreSQL错误。。。2013年没有解决这个问题的方案??经过进一步挖掘,似乎表明限制在9.2中得到了修正(奇怪的是,海报使用的示例实际上并没有验证)。是的,非常感谢。我按照你的提示(答案)要求@yankee测试一个标量案例。。。这是Yankee的测试结果!现在我真的相信pg9.2是我的解决方案;-)问题:你(JLRishe)做“挖掘工作”,但扬基在答案的正文中展示了解决方案。。。我会投票给两个。。。但是悬赏给谁?(检查规则并等待其他人的投票)。从技术上讲,我确实在评论中提供了答案,只是还没有将其添加到我的答案正文中。我现在已经修改过了。当然,这取决于你选择一个获胜者,但是如果你不选择,并且没有人投票,我们两个都不会得到赏金。如果有更多的选票,那么得票最多的人将得到一半的奖金。哼。。。好的,一个PostgreSQL错误。。。2013年没有解决该问题的方案??在进一步挖掘之后,似乎表明该限制已在9.2中得到纠正(尽管示例中的pos