[Omaha.pm] get_xpath via Perl, Template Toolkit (XML::Twig)

Jay Hannah jay at jays.net
Fri Mar 7 12:47:18 PST 2008


When parsing XML your xpath statement can say things like:

   'b/c[@jay="rules" and @justin="rules too"]/d'

Which says... 

   foreach b node that has a
     child c node that has
        an attribute "jay" set to "rules"
        AND an attribute "justin" set to "rules too"
           and has a child d node

...grab those d nodes.

We were having problems, though. The AND part seemed not to be working 
deep in the bowels of our real-world scenario inside Template Toolkit.

So I made the simplest possible recreation set, below.

XML::Twig rules.  :)

j



$ cat blah.xml
<a>
  <b>
    <c jay="rules"/>
    <c jay="rules" justin="rules too">
      <d>boo-ya!</d>
    </c>
    <c justin="rules too"/>
  </b>
</a>


$ cat j.pl
#!/usr/bin/perl

use Template;
use XML::Twig;

my $twig = XML::Twig->new( pretty_print => 'indented' );
$twig->parsefile('blah.xml');
$twig = $twig->root;

# -----------------------------
#  Using Perl
# -----------------------------
print "Using Perl:\n";
foreach my $d ($twig->get_xpath('b/c[@jay="rules" and @justin="rules 
too"]/d')) {
   print $d->text;
}
print "\n\n";

# -----------------------------
#  Using Template Toolkit
# -----------------------------
my $template = Template->new();
$template->process('j.tt', { twig => $twig })
   || die $template->error();


$ cat j.tt
Using Template Toolkit:
[%
   FOREACH d IN twig.get_xpath('b/c[@jay="rules" and @justin="rules 
too"]/d');
      d.text;
   END;
%]


$ perl j.pl
Using Perl:
boo-ya!

Using Template Toolkit:
boo-ya!




More information about the Omaha-pm mailing list