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