diff options
author | Gianni Ceccarelli <dakkar@dechirico.(none)> | 2009-03-20 15:13:59 +0100 |
---|---|---|
committer | Gianni Ceccarelli <dakkar@dechirico.(none)> | 2009-03-20 15:13:59 +0100 |
commit | 92f310bf8712f12dbc3717b2529df4694a073310 (patch) | |
tree | 0fb10a2e6bd7a3919395a6b66a4b6a883e6bdf14 /lib/Tree/Transform/XSLTish | |
parent | renaming merge (diff) | |
download | Tree-Transform-XSLTish-92f310bf8712f12dbc3717b2529df4694a073310.tar.gz Tree-Transform-XSLTish-92f310bf8712f12dbc3717b2529df4694a073310.tar.bz2 Tree-Transform-XSLTish-92f310bf8712f12dbc3717b2529df4694a073310.zip |
it's now possible to change the XPath engine for each transformer
added a test that uses XML::XPathEngine and HTML::TreeBuilder::XPath
Diffstat (limited to 'lib/Tree/Transform/XSLTish')
-rw-r--r-- | lib/Tree/Transform/XSLTish/Transformer.pm | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/lib/Tree/Transform/XSLTish/Transformer.pm b/lib/Tree/Transform/XSLTish/Transformer.pm index 2f8fc52..8b06422 100644 --- a/lib/Tree/Transform/XSLTish/Transformer.pm +++ b/lib/Tree/Transform/XSLTish/Transformer.pm @@ -1,12 +1,23 @@ package Tree::Transform::XSLTish::Transformer; use Moose; use MooseX::AttributeHelpers; +use Moose::Util::TypeConstraints; use Params::Validate ':all'; use Tree::Transform::XSLTish::Utils; use Tree::Transform::XSLTish::Context; use Tree::XPathEngine; use Carp::Clan qw(^Tree::Transform::XSLTish); +subtype 'Tree::Transform::XSLTish::Engine' + => as 'Object' + => where { + my $object=$_; + for my $meth (qw(findnodes matches exists)) { + return unless $object->can($meth); + } + return 1; + }; + has 'rules_package' => (is => 'ro', isa => 'ClassName'); has 'context_stack' => ( @@ -24,7 +35,7 @@ has 'context_stack' => ( has 'engine' => ( is => 'ro', - isa => 'Tree::XPathEngine', + isa => 'Tree::Transform::XSLTish::Engine', default => sub { Tree::XPathEngine->new() }, ); @@ -33,7 +44,7 @@ sub it { $_[0]->context->current_node } sub transform { my ($self,$tree)=@_; - return $self->apply_rules($tree->xpath_get_root_node); + return $self->apply_rules($self->engine->findnodes('/',$tree)); } sub apply_rules { @@ -44,7 +55,7 @@ sub apply_rules { carp 'apply_rules called without nodes nor context!'; return; } - @nodes=$self->it->xpath_get_child_nodes(); + @nodes=$self->engine->findnodes('*',$self->it); }; my $guard=Tree::Transform::XSLTish::ContextGuard->new @@ -153,17 +164,15 @@ sub rule_matches { # XXX check the semantic my $base_node=$node; - while (1) { + while ($base_node) { #warn "# Testing <$path> against @{[ $node ]} based on @{[ $base_node ]}"; if ($self->engine->matches($node,$path,$base_node)) { return 1; } - if ($base_node->xpath_is_document_node) { - return; - } - $base_node=$base_node->xpath_get_parent_node; + + ($base_node)=$self->engine->findnodes('..',$base_node); } return; } |