Re: [PHP5 & DOM] element extracted from doc suddenly not found in insertBefore() -- NS problem

From: Rutger Claes (rgc_at_rgc.tld-of-belgium)
Date: 12/02/04


Date: Thu, 02 Dec 2004 17:01:09 +0100

konsu wrote:

> there must be a method similar to createElement() which creates an element
> in a given namespace. also check out
>
http://us2.php.net/manual/en/function.dom-domdocument-getelementsbytagnamens.php
>
> konstantin
>

If you replace the code with all the ...NS() functions the result is
identical. The problem is that when you extract a node from the document
and use it to insert another, the node suddenly is not found.

New code:
$xml = DomDocument::loadXML( $xsl );

$t_list =
$xml->getElementsByTagnameNS( 'http://www.w3.org/1999/XSL/Transform',
'template' );
if( $t_list && $t_list->item(0) ) {
 print $t_list->item(0)->tagName;
 
 $new_tag = $xml->createElementNS( 'http://www.w3.org/1999/XSL/Transform',
'param' );
 try {
  $xml->insertBefore( $new_tag, $t_list->item(0) );
  print $xml->saveXML();
 } catch( DomException $e ) {
  print $e->getMessage();
 }
}
else {
 die( "No tags found" );
}

xsl stays the same.
This still gives "Not found error"

Is this a bug in the PHP5 DOM implementation?

> "Rutger Claes" <rgc@rgc.tld-of-belgium> wrote in message
> news:1101891341.571656@seven.kulnet.kuleuven.ac.be...
>> Code and problem are from PHP5:
>>
>> When I execute the following piece of code, the DomException is thrown
>> with
>> a message: Not Found Exception.
>> I assume this means that the node I extracted from the DomDocument using
>> getElementsByTagName() isn't found when I use insertBefore(). I blame
>> the namespace :-)
>> When I replace the getElementsByTagName( 'xsl:template' ), I get the "no
>> template tag found message" in the else.
>> What is the NS-safe way to insert a xsl:param tag before the xsl:template
>> tags?
>>
>> <?php
>>
>> $xsl = <<<XSL
>> <?xml version="1.0" ?>
>> <xsl:style*** version="1.0"
>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>>
>> <xsl:import href="xhtml/basic.xhtml.xsl" />
>> <xsl:import href="xhtml/search.xhtml.xsl" />
>> <xsl:import href="xhtml/news.xhtml.xsl" />
>>
>> <xsl:output
>> method="xml"
>> omit-xml-declaration="no"
>> doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
>> indent="yes"
>> media-type="text/html"
>> />
>>
>> <xsl:param name="updatetime" />
>>
>> <xsl:template match="/">
>> <xsl:apply-imports />
>> </xsl:template>
>>
>> </xsl:style***>
>> XSL;
>>
>> $style*** = DomDocument::loadXML( $xsl );
>> $temp_list = $style***->getElementsByTagName( 'template' );
>> if( $temp_list && $temp_list->item(0) ) {
>> $template = $temp_list->item(0);
>> $param = $style***->createElement( 'xsl:param' );
>> try {
>> $style***->insertBefore( $param, $template );
>> } catch( DomException $e ) {
>> print "Exception ".$e->getMessage();
>> print "\n";
>> print $template->tagName;
>> }
>>
>> }
>> else {
>> die( "No template tag found" );
>> }
>> ?>
>>
>> Thanks in advance.
>> Rutger Claes
>> --
>> Rutger Claes rgc@rgc.tld
>> Replace tld with top level domain of belgium to contact me
>> pgp:0x3B7D6BD6
>> Overflow on /dev/null, please empty the bit bucket.
>>

-- 
Rutger Claes                                                rgc@rgc.tld
Replace tld with top level domain of belgium to contact me    pgp:0x3B7D6BD6
Long computations which yield zero are probably all for naught.

Loading