AxKit.org [logo curtesy of http://xml.com]
--sep--
Start Navigation
About AxKit
Index
xml.apache.org
Features
Live Sites
Installation
Documentation
Daily Churn
Getting AxKit
License
Download
Mailing List
Contribute
CVS
Support
Bugs
End Navigation
Prev Top Next

A Complete Example

Now lets put all of these ideas together into a (almost) complete example. This is part of the stylesheet I use to process my docbook articles online:

<!--#include file="docbook_tags.xps"-->
<%

my %links;
my $linkid = 0;
$t->{'ulink'}{testcode} = sub { 
		my $node = shift;
		my $t = shift;
		my $url = findvalue('@url', $node);
		if (!exists $links{$url}) {
			$linkid++;
			$links{$url} = $linkid;
		}
		my $link_number = $links{$url};
		$t->{pre} = "<i><a href=\"$url\">";
		$t->{post} = " [$link_number]</a></i>";
		return 1;
	};

%>
<html>
<head>
	<title><%= findvalue('/article/artheader/title/text()') %></title>
</head>
<body bgcolor="white">

<%
# display title/TOC page
print apply_templates('/article/artheader/*');
%>

<hr>

<%
# display particular page
foreach my $section (findnodes("/article/sect1")) {
	print apply_templates($section);
}
%>

<h1>List of Links</h1>
<table border="1">
<th>URL</th>
<%
for my $link (sort {$links{$a} <=> $links{$b}} keys %links) {
%>
<tr>
<td><%= "[$links{$link}] $link" %></td>
</tr>
<% } %>
</table>

</body>
</html>
The very first line there imports a library of tags that are shared between this stylesheet, and one that is easier for web viewing with clickable links between sections (which can be downloaded here). The import system is based on Server Side Includes (SSI) although only SSI file includes are supported at this time (SSI virtual includes can be implemented using mod_include). Here is part of the docbook_tags.xps file:
<%

$t->{'attribution'}{pre} = "<i>";
$t->{'attribution'}{post} = "</i><br>\n";

$t->{'para'}{pre} = '<p>';
$t->{'para'}{post} = '</p>';

$t->{'ulink'}{testcode} = sub { 
		my $node = shift;
		my $t = shift;
		$t->{pre} = "<i><a href=\"" .
						findvalue('./@url', $node) . "\">";
		$t->{post} = '</a></i>';
		return 1;
	};

$t->{'title'}{testcode} = sub { 
		my $node = shift;
		my $t = shift;
		if (findvalue('parent::blockquote', $node)) {
			$t->{pre} = "<b>";
			$t->{post} = "</b><br>\n";
		}
		elsif (findvalue('parent::artheader', $node)) {
			$t->{pre} = "<h1>";
			$t->{post} = "</h1>";
		}
		else {
			my $parent = findvalue('name(..)', $node);
			if (my ($level) = $parent =~ m/sect(\d+)$/) {
				$t->{pre} = "<h$level>";
				$t->{post} = "</h$level>";
			}
		}

		return 1;
	};

%>

We go into detail of what is happening in this example in the next section.


Prev Top Next

Printer Friendly
Raw XML