On Thu, Feb 19, 2015 at 5:53 AM, Marko Tiikkaja <ma...@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