This is a discussion on [PHP5 & DOM] element extracted from doc suddenly not found in insertBefore() -- NS problem within the PHP Language forums, part of the PHP Programming Forums category; Code and problem are from PHP5: When I execute the following piece of code, the DomException is thrown with a ...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
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:stylesheet 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:stylesheet> XSL; $stylesheet = DomDocument::loadXML( $xsl ); $temp_list = $stylesheet->getElementsByTagName( 'template' ); if( $temp_list && $temp_list->item(0) ) { $template = $temp_list->item(0); $param = $stylesheet->createElement( 'xsl:param' ); try { $stylesheet->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. |
|
|||
|
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/functio...ytagnamens.php konstantin "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:stylesheet 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:stylesheet> > XSL; > > $stylesheet = DomDocument::loadXML( $xsl ); > $temp_list = $stylesheet->getElementsByTagName( 'template' ); > if( $temp_list && $temp_list->item(0) ) { > $template = $temp_list->item(0); > $param = $stylesheet->createElement( 'xsl:param' ); > try { > $stylesheet->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. > |
|
|||
|
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/functio...ytagnamens.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:stylesheet 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:stylesheet> >> XSL; >> >> $stylesheet = DomDocument::loadXML( $xsl ); >> $temp_list = $stylesheet->getElementsByTagName( 'template' ); >> if( $temp_list && $temp_list->item(0) ) { >> $template = $temp_list->item(0); >> $param = $stylesheet->createElement( 'xsl:param' ); >> try { >> $stylesheet->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. |
|
|||
|
here is something that does not fail but it shows no output for saveXML. i
did not spend time trying to figure out why. $xml = new DOMDocument; $xml->loadXML($xsl); $t_list = $xml->getElementsByTagnameNS( 'http://www.w3.org/1999/XSL/Transform','template' ); if( $t_list && $t_list->item(0) ) { echo($xml->documentElement->tagName); $new_tag = $xml->createElementNS( 'http://www.w3.org/1999/XSL/Transform','param' ); try { $xml->documentElement->insertBefore( $new_tag, $t_list->item(0) ); echo($xml->saveXML()); } catch( DomException $e ) { echo($e->getMessage()); } } else { die( "No tags found" ); } "Rutger Claes" <rgc@rgc.tld-of-belgium> wrote in message news:1102003188.895445@seven.kulnet.kuleuven.ac.be ... > 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/functio...ytagnamens.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:stylesheet 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:stylesheet> >>> XSL; >>> >>> $stylesheet = DomDocument::loadXML( $xsl ); >>> $temp_list = $stylesheet->getElementsByTagName( 'template' ); >>> if( $temp_list && $temp_list->item(0) ) { >>> $template = $temp_list->item(0); >>> $param = $stylesheet->createElement( 'xsl:param' ); >>> try { >>> $stylesheet->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. > |