Re: xpath changes in the recent back branches

Поиск
Список
Период
Сортировка
От Mike Rylander
Тема Re: xpath changes in the recent back branches
Дата
Msg-id CAO8ar=n1pGwe=QSMVG88604qz07NBXkdH9Fi3WUwjU7ay6__ag@mail.gmail.com
обсуждение исходный текст
Ответ на xpath changes in the recent back branches  (Marko Tiikkaja <marko@joh.to>)
Список pgsql-hackers
On Thu, Feb 19, 2015 at 5:53 AM, Marko Tiikkaja <marko@joh.to> wrote:
Hi,

Commit 79af9a1d2668c9edc8171f03c39e7fed571eeb98 changed xpath handling with regard to namespaces, and it seems to be fixing an actual issue. However, it was also backpatched to all branches despite it breaking for example code like this:

do $$
declare
_x xml;
begin
_x := (xpath('/x:Foo/x:Bar', xml '<Foo xmlns="teh:urn"><Bar><Baz>1</Baz><Bat>2</Bat></Bar></Foo>', array[['x','teh:urn']]))[1];
raise notice '%', xpath('/Bar/Baz/text()', _x);
raise notice '%', xpath('/Bar/Bat/text()', _x);
end
$$;

The problem is that there's no way to write the code like this in such a way that it would work on both versions.  If I add the namespace, it's broken on 9.1.14.  Without it it's broken on 9.1.15.

I'm now thinking of adding a workaround which strips namespaces, but that doesn't seem to be easy to do, even with PL/Perl.  Is there a better workaround here that I'm not seeing?

 
FWIW, I've been working around the bug fixed in that commit for ages by spelling my xpath like this:

  xpath('/*[local-name()="Bar"]/*[local-name()="Baz"]/text()', data)

I've modularized my XML handling functions so the source of 'data' is immaterial -- maybe it's a full document, maybe it's a fragment from a previous xpath() call -- and the referenced commit is going to make correct XPATH much more sane, readable, and maintainable.  I, for one, welcome it wholeheartedly.

HTH,

--Mike

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Jeff Janes
Дата:
Сообщение: Re: Comparing primary/HS standby in tests
Следующее
От: Paul Ramsey
Дата:
Сообщение: Re: compress method for spgist - 2