From 26248672c6b3ee8f8b10dff5f2b8302e008f46c1 Mon Sep 17 00:00:00 2001 From: Gianni Ceccarelli Date: Fri, 27 Mar 2009 13:00:46 +0100 Subject: LibXML with namespace support, and fixed tests --- lib/Tree/Template/Declare/LibXML.pm | 42 ++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) (limited to 'lib/Tree/Template/Declare/LibXML.pm') diff --git a/lib/Tree/Template/Declare/LibXML.pm b/lib/Tree/Template/Declare/LibXML.pm index 7be3fe8..f8c0e01 100644 --- a/lib/Tree/Template/Declare/LibXML.pm +++ b/lib/Tree/Template/Declare/LibXML.pm @@ -7,7 +7,18 @@ use XML::LibXML; sub new { my ($class)=@_; - return bless {},$class; + return bless {ns=>{':default'=>undef}},$class; +} + +sub _additional_exports { + my ($self)=@_; + + return { + xmlns => sub($$) { + $self->{ns}->{$_[0]}=$_[1]; + return; + }, + }; } sub new_tree { @@ -22,6 +33,21 @@ sub finalize_tree { return $tree; } +sub _get_ns { + my ($self,$name)=@_; + + my ($prefix)=($name=~m{\A (.*?) : }smx); + + if (!defined($prefix) or length($prefix)==0) { + return '',$self->{ns}->{':default'}; + } + + if (exists $self->{ns}->{$prefix}) { + return $prefix, $self->{ns}->{$prefix}; + } + return; +} + sub new_node { my ($self)=@_; @@ -46,14 +72,24 @@ sub add_child_node { sub set_node_name { my ($self,$node,$name)=@_; - return $node->setNodeName($name); + $node->setNodeName($name); + my ($prefix,$uri)=$self->_get_ns($name); + if ($uri) { + $node->setNamespace($uri,$prefix,1); + } } sub set_node_attributes { my ($self,$node,$attrs)=@_; while (my ($name,$val)=each %$attrs) { - $node->setAttribute($name, $val); + my ($prefix,$uri)=$self->_get_ns($name); + if ($prefix and $uri) { + $node->setAttributeNS($uri, $name, $val); + } + else { + $node->setAttribute($name, $val); + } } return; } -- cgit v1.2.3