Thread: xpath differences between postgres 11.4 and 10.3
Hi!!
I have an strange behavior between 11.4 and 10.3 with xpath function:
With pgsql 10.3 i have:
select xpath('@idc', '<p idc="4776" rc="Cuadro" idrg="5"/>' ) ;
xpath
--------
{4776}
(1 fila)
xpath
--------
{4776}
(1 fila)
and with pgsql 11.4:
select xpath('@idc', '<p idc="4776" rc="Cuadro" idrg="5"/>'::xml ) ;
xpath
-------
{}
(1 fila)
xpath
-------
{}
(1 fila)
Now, if change the expression with "//":
select xpath('//@idc', '<p idc="4776" rc="Cuadro" idrg="5"/>'::xml ) ; xpath
--------
{4776}
(1 fila)
--------
{4776}
(1 fila)
In release notes for postgresql 11 say:
Correctly handle relative path expressions in
xmltable()
,xpath()
, and other XML-handling functions (Markus Winand)Per the SQL standard, relative paths start from the document node of the XML input document, not the root node as these functions previously did.
Despite this note I do not undertand why it behaves differently ... or maybe I do not understand the note well ... what do you think?
thanks in advance!
regards!
![]() |
On Friday, July 5, 2019, Felipe de Jesús Molina Bravo <fjmolinabravo@gmail.com> wrote:
<p idc="4776" rc="Cuadro" idrg="5"/>'Per the SQL standard, relative paths start from the document node of the XML input document, not the root node as these functions previously did.
The absolute path to the 4776 in the document is:
/p::attribute[id]
In v10 relative pathing looks like (root element node):
/p<you-are-here>::attribute[ id]
In v11 relative pathing looks like (document root node):
/<you-are-here>p::attribute[ id]
You either need to specify your root element name in your xpath expression or, less precisely, use // to look for the attribute anywhere
David J.
ok David I get it! now i undestand the note!!
very grateful with your answer
See you!!
El sáb., 6 jul. 2019 a las 2:29, David G. Johnston (<david.g.johnston@gmail.com>) escribió:
On Friday, July 5, 2019, Felipe de Jesús Molina Bravo <fjmolinabravo@gmail.com> wrote:<p idc="4776" rc="Cuadro" idrg="5"/>'Per the SQL standard, relative paths start from the document node of the XML input document, not the root node as these functions previously did.The absolute path to the 4776 in the document is:/p::attribute[id]In v10 relative pathing looks like (root element node):/p<you-are-here>::attribute[id]In v11 relative pathing looks like (document root node):/<you-are-here>p::attribute[id]You either need to specify your root element name in your xpath expression or, less precisely, use // to look for the attribute anywhereDavid J.