Edit report at http://bugs.php.net/bug.php?id=49490&edit=1

 ID:               49490
 Updated by:       johan...@php.net
 Reported by:      olav dot morken at uninett dot no
 Summary:          XPath namespace prefix conflict
-Status:           Open
+Status:           Assigned
 Type:             Bug
 Package:          DOM XML related
 Operating System: Linux (Debian)
 PHP Version:      5.3.0
-Assigned To:      
+Assigned To:      rrichards



Previous Comments:
------------------------------------------------------------------------
[2010-04-17 11:14:50] thomas at weinert dot info

It looks like DOMXPath->evaluate()/DOMXPath->query() registers the
namespace prefixes of the given context and overrides any definition
from DOMXPath->registerNamespace(). PHP should not register any
namespaces from the context or at least prefer manual registrations over
automatic.



Reproduce code:

---------------

$dom = new DOMDocument();

$dom->loadXML(

  '<foobar><a:foo xmlns:a="urn:a">'.

  '<b:bar xmlns:b="urn:b"/></a:foo>'.

  '</foobar>'

);

$xpath = new DOMXPath($dom);



//get context node and check "a:foo"

$context = $dom->documentElement->firstChild;

var_dump($context->tagName);



// try to override the context node

$xpath->registerNamespace('a', 'urn:b');

var_dump(

  $xpath->evaluate(

    'descendant-or-self::a:*',

    $context

  )->item(0)->tagName

);



// use a prefix not used in context

$xpath->registerNamespace('prefix', 'urn:b');

var_dump(

  $xpath->evaluate(

    'descendant-or-self::prefix:*',

    $context

  )->item(0)->tagName

);



Expected result:

----------------

string(5) "a:foo"

string(5) "b:bar"

string(5) "b:bar"



Actual result:

----------------

string(5) "a:foo"

string(5) "a:foo"

string(5) "b:bar"

------------------------------------------------------------------------
[2009-09-07 08:41:26] olav dot morken at uninett dot no

Description:
------------
When processing an XML document with namespaces, an XPath query for a
node with a different namespace but the same namespace prefix fails.



This appears to be a conflict between the XPath namespaces and the
document namespaces. It works if either:

- The prefix in the query is replaced with a prefix that doesn't

  exist in the document.

- If the prefix in the query matches the prefix in the document.



This was tested with:

- PHP 5.3 from debian experimental: 5.3.0-3

- libxml2 2.7.3.dfsg-2.1



Reproduce code:
---------------
$doc = new DOMDocument();

$doc->loadXML('<prefix:root xmlns:prefix="urn:a" />');



$xp = new DOMXPath($doc);

$xp->registerNamespace('prefix', 'urn:b');



echo($xp->query('//prefix:root')->length . "\n");



Expected result:
----------------
It should not find the root node, since we ask for a node in a different
prefix. I.e. it should print '0'.





Actual result:
--------------
It finds the root node, i.e. it prints '1'.








------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=49490&edit=1

Reply via email to