Skip site navigation (1) Skip section navigation (2)

BUG #4024: xpath() results lose namespace mappings

From: "Matt Magoffin" <postgresql(dot)org(at)msqr(dot)us>
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #4024: xpath() results lose namespace mappings
Date: 2008-03-11 01:46:24
Message-ID: 200803110146.m2B1kOae071817@wwwmaster.postgresql.org (view raw or flat)
Thread:
Lists: pgsql-bugs
The following bug has been logged online:

Bug reference:      4024
Logged by:          Matt Magoffin
Email address:      postgresql(dot)org(at)msqr(dot)us
PostgreSQL version: 8.3.0
Operating system:   OS X 10.5, Windows XP
Description:        xpath() results lose namespace mappings
Details: 

I was trying to extract XML fragments within a pl/pgsql function by nested
xpath() function calls, and found that when namespaces are used in the
XML, only the first xpath() call is able to correctly use namespaces.

First here is an example that works, when no namespaces are used:

BEGIN;
CREATE TEMPORARY TABLE tmp_xpath_test (x xml) ON COMMIT DROP;
INSERT INTO tmp_xpath_test VALUES (
	'<foo><bar x="y">bar1</bar><bar x="y">bar2</bar></foo>'::xml);
SELECT (xpath('/foo/bar[1]', t.x))[1] FROM tmp_xpath_test t;
SELECT xpath('/bar/@x', (xpath('/foo/bar[1]', t.x))[1]) FROM
tmp_xpath_test t;
COMMIT;

The first select is just there to show the result of the inner call to
xpath() in the second select, and the second select returns:

SELECT xpath('/bar/@x', (xpath('/foo/bar[1]', t.x))[1]) FROM
tmp_xpath_test t;
xpath
-------
{y}
(1 row)

Now if I use XML with namespaces, the first SELECT works, but the second
never returns the expected results:

BEGIN;
CREATE TEMPORARY TABLE tmp_xpath_test (x xml) ON COMMIT DROP;
INSERT INTO tmp_xpath_test VALUES (
	'<a:foo xmlns:a="a:urn"><a:bar x="y">bar1</a:bar><a:bar
x="y">bar2</a:bar></a:foo>'::xml);
SELECT (xpath('/a:foo/a:bar[1]', t.x, ARRAY[ARRAY['a','a:urn']]))[1] FROM
tmp_xpath_test t;
SELECT xpath('/a:bar/@x', (xpath('/a:foo/a:bar[1]', t.x,
ARRAY[ARRAY['a','a:urn']]))[1],
	ARRAY[ARRAY['a','a:urn']]) FROM tmp_xpath_test t;
COMMIT;

The select results are

SELECT (xpath('/a:foo/a:bar[1]', t.x, ARRAY[ARRAY['a','a:urn']]))[1] FROM
tmp_xpath_test t;
          xpath
---------------------------
<a:bar x="y">bar1</a:bar>
(1 row)

SELECT xpath('/a:bar/@x', (xpath('/a:foo/a:bar[1]', t.x,
ARRAY[ARRAY['a','a:urn']]))[1],
lms_kia(> ARRAY[ARRAY['a','a:urn']]) FROM tmp_xpath_test t;
xpath
-------
{}
(1 row)

For the second select, I expected a single XML text node containing "y",
just like from the no-namespace result.

Responses

pgsql-bugs by date

Next:From: JamesDate: 2008-03-11 17:05:29
Subject: BUG #4025: wsock32.dll not found
Previous:From: Laurent BirtzDate: 2008-03-10 23:29:07
Subject: Re: LISTEN/NOTIFY race condition?

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group