diff options
author | Gianni Ceccarelli <dakkar@dechirico.(none)> | 2009-03-27 13:00:46 +0100 |
---|---|---|
committer | Gianni Ceccarelli <dakkar@dechirico.(none)> | 2009-03-27 13:00:46 +0100 |
commit | 26248672c6b3ee8f8b10dff5f2b8302e008f46c1 (patch) | |
tree | 0035267f3e4b3ab4aa64c22ca60d2018cc6b6e1d /lib/Tree/Template/Declare/LibXML.pm | |
parent | libxml, no namespace support (diff) | |
download | Tree-Template-Declare-26248672c6b3ee8f8b10dff5f2b8302e008f46c1.tar.gz Tree-Template-Declare-26248672c6b3ee8f8b10dff5f2b8302e008f46c1.tar.bz2 Tree-Template-Declare-26248672c6b3ee8f8b10dff5f2b8302e008f46c1.zip |
LibXML with namespace support, and fixed tests
Diffstat (limited to 'lib/Tree/Template/Declare/LibXML.pm')
-rw-r--r-- | lib/Tree/Template/Declare/LibXML.pm | 42 |
1 files changed, 39 insertions, 3 deletions
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; } |