1

SQL/XML標準のコンプライアンスにXPath-1を採用しているPostgreSQL9を使用しています。

このクエリは問題なく、期待されるデータを返します。

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

しかし、このもう1つは、img要素をカウントするために、空(!)を返します。

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

1:xhtmフィールドコンテンツのサンプル、

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

2:もちろんarray_length(xpath('//img',xhtm),1)カウント結果を表示しますが、XPathカウントではありません。

3:それが一般的なSQL / XMLの特性なのか、PosgreSQLServer9.0.5固有のバグ/問題なのかわかりません。

4

2 に答える 2

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)
于 2013-03-12T19:17:11.910 に答える
2

編集:以下のコメントで指摘したように、この SO Answerに示されているように、この問題は明らかに Postgresql 9.2 で対処されました。その答えは次のように述べています。

PostgreSQL 9.2 では、ドキュメントに xpath 関数をカバーする文が突然追加されました。

XPath 式がノード セットではなくスカラー値を返す場合、単一要素の配列が返されます。

必要なものだけ!したがって、質問に関連して、別の有効な答えは次のとおりです。PostgreSQL 9.2にアップグレードします。

以下は私の元の答えの残りの部分です:

これは、Postgresql のxpath()関数の既知の制限のようです。ノード セットに評価される式だけが何かを返します。スカラー値を返す XPath 式は、空の配列を返すだけです。

一部の Google 検索では、主に Florian Pflug という人物による約 2 年前の議論が明らかになりました。

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


彼はおそらく問題を修正するパッチを開発し、次のスレッドに添付されています (ただし、これが最新バージョンであるかどうかは完全にはわかりません)。

http://www.postgresql.org/message-id/FC60A4F5-5560-438C-97E8-B6D1FDE1CC2B@phlo.org


彼のパッチの長所と短所についていくつかの議論があるようです.

http://www.postgresql.org/message-id/201106291957.04251.rsmogura@softperience.eu http://www.postgresql.org/message-id/201106291934.23089.rsmogura@softperience.eu

于 2013-03-11T20:04:18.127 に答える