E.4.1.1. Extracting values
A simple example to get
us
started is to use the API to bring in the
title from a DocBook article. A DocBook article title looks like
this:
<article>
<artheader>
<title>XPathScript - A Viable Alternative to XSLT?</title>
...
The XPath expression to retrieve the text in the
<title> element is:
/article/artheader/title/text( )
Putting all this together to make this text into the HTML title, we
get the following XPathScript stylesheet:
<html>
<head>
<title><%= findvalue("/article/artheader/title") %></title>
</head>
<body>
This was a DocBook Article.
We're only extracting the title for now!
<p>
The title was: <%= findvalue("/article/artheader/title") %>
</body>
</html>
Again, we see the XPath syntax being used to find the nodes in the
document, along with the function findvalue( ).
Similarly, a list of nodes can be extracted (and thus looped over)
using the findnodes( ) function:
...
<%
for my $sect1 (findnodes("/article/sect1")) {
print $sect1->findvalue("title"), "<br>\n";
for my $sect2 ($sect1->findnodes("sect2")) {
print " + ", $sect2->findvalue("title"), "<br>\n";
for my $sect3 ($sect2->findnodes("sect3")) {
print " + + ", $sect3->findvalue("title"), "<br>\n";
}
}
}
%>
...
Here we see how we can apply the find* functions
to individual nodes as methods, which makes the node the context node
to search from. That is,
$node->findnodes("title") finds
<title> child nodes of
$node.
E.4.1.2. Declarative templates
We saw declarative templates
earlier
in this appendix, in
Section E.2. The
$t hash is the key to declarative templates. The
apply_templates( ) function iterates over the
nodes of your XML file, applying the templates defined in the
$t hash reference as it meets matching tags. This
is the most important feature of XpathScript, because it allows you
to define the appearance of individual tags without having to do your
own iteration logic. We call this declarative
templating.
The keys of $t are the names of the elements,
including namespace prefixes where appropriate. When
apply_templates( ) is called, XPathScript tries to
find a member of $t that matches the element name.
The following subkeys define the transformation:
- pre
-
Output to occur before the tag
- post
-
Output to occur after the tag
- prechildren
-
Output to occur before the children of this tag are written
- postchildren
-
Output to occur after the children of this tag are written
- prechild
-
Output to occur before every child element of this tag
- postchild
-
Output to occur after every child element of this tag
- showtag
-
Set to a false value (generally zero) to disable rendering of the tag
itself
- testcode
-
Code to execute upon visiting this tag
More details about XPathScript can be found on the AxKit web site, at
http://axkit.org/.