diff options
Diffstat (limited to 'lib/Tree/Template')
-rw-r--r-- | lib/Tree/Template/Declare.pm | 6 | ||||
-rw-r--r-- | lib/Tree/Template/Declare/LibXML.pm | 42 |
2 files changed, 45 insertions, 3 deletions
diff --git a/lib/Tree/Template/Declare.pm b/lib/Tree/Template/Declare.pm index 9778f42..a2be8e2 100644 --- a/lib/Tree/Template/Declare.pm +++ b/lib/Tree/Template/Declare.pm @@ -45,6 +45,11 @@ sub _build_group { } } + my $additional_exports={}; + if ($builder->can('_additional_exports')) { + $additional_exports=$builder->_additional_exports(); + } + my @current_node=(undef); return { @@ -76,6 +81,7 @@ sub _build_group { $builder->set_node_attributes($current_node[0],\%attrs); return; }, + %$additional_exports, }; } 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; } |