By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,509 Members | 1,307 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,509 IT Pros & Developers. It's quick & easy.

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

P: n/a
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 rg*@rgc.tld
Replace tld with top level domain of belgium to contact me pgp:0x3B7D6BD6
Overflow on /dev/null, please empty the bit bucket.

Jul 17 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
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" <rg*@rgc.tld-of-belgium> wrote in message
news:11***************@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 rg*@rgc.tld
Replace tld with top level domain of belgium to contact me
pgp:0x3B7D6BD6
Overflow on /dev/null, please empty the bit bucket.

Jul 17 '05 #2

P: n/a
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" <rg*@rgc.tld-of-belgium> wrote in message
news:11***************@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 rg*@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 rg*@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.

Jul 17 '05 #3

P: n/a
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" <rg*@rgc.tld-of-belgium> wrote in message
news:11***************@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" <rg*@rgc.tld-of-belgium> wrote in message
news:11***************@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 rg*@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 rg*@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.

Jul 17 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.