Connecting Tech Pros Worldwide Forums | Help | Site Map

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

Rutger Claes
Guest
 
Posts: n/a
#1: Jul 17 '05
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
Guest
 
Posts: n/a
#2: Jul 17 '05

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


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 ...[color=blue]
> 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.
>[/color]


Rutger Claes
Guest
 
Posts: n/a
#3: Jul 17 '05

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


konsu wrote:
[color=blue]
> there must be a method similar to createElement() which creates an element
> in a given namespace. also check out
>[/color]
http://us2.php.net/manual/en/functio...ytagnamens.php[color=blue]
>
> konstantin
>[/color]

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?
[color=blue]
> "Rutger Claes" <rgc@rgc.tld-of-belgium> wrote in message
> news:1101891341.571656@seven.kulnet.kuleuven.ac.be ...[color=green]
>> 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.
>>[/color][/color]

--
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.

konsu
Guest
 
Posts: n/a
#4: Jul 17 '05

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


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 ...[color=blue]
> konsu wrote:
>[color=green]
>> there must be a method similar to createElement() which creates an
>> element
>> in a given namespace. also check out
>>[/color]
> http://us2.php.net/manual/en/functio...ytagnamens.php[color=green]
>>
>> konstantin
>>[/color]
>
> 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?
>[color=green]
>> "Rutger Claes" <rgc@rgc.tld-of-belgium> wrote in message
>> news:1101891341.571656@seven.kulnet.kuleuven.ac.be ...[color=darkred]
>>> 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.
>>>[/color][/color]
>
> --
> 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.
>[/color]


Closed Thread