--- nfo/perl/libs/XML/XUpdate/XSLT.pm 2003/05/01 17:03:52 1.2 +++ nfo/perl/libs/XML/XUpdate/XSLT.pm 2003/05/01 20:11:49 1.3 @@ -4,11 +4,12 @@ # # By Andreas Motl, andreas.motl@ilo.de # -# $Id: XSLT.pm,v 1.2 2003/05/01 17:03:52 joko Exp $ +# $Id: XSLT.pm,v 1.3 2003/05/01 20:11:49 joko Exp $ # # $Log: XSLT.pm,v $ -# Revision 1.2 2003/05/01 17:03:52 joko -# revamped processing: a) _calculate and b) _apply (NEW) +# Revision 1.3 2003/05/01 20:11:49 joko +# * added pod from xupdate.pl +# - extracted xml to external files # # Revision 1.1 2003/04/30 02:36:32 joko # initial commit @@ -16,10 +17,60 @@ # ############################################################################### +=pod + + =head1 NAME XML::XUpdate::XSLT - A perl module for updating xml documents using XUpdate via XSLT. + +=head3 Overview + + This is not the same xupdate currently available from CPAN at + http://search.cpan.org/author/PAJAS/XML-XUpdate-LibXML-0.4.0/xupdate . + + Its intention - however - is identical: + xupdate - Process XUpdate commands against an XML document. + + +=head3 Their implementations differ: + + 1. xupdate (by Petr Pajas) uses ... + XML::XUpdate::LibXML - Simple implementation of XUpdate format + + ... which is based on XML::LibXML which in turn is: + [...] + This module is an interface to the gnome libxml2 DOM parser (no SAX parser support yet), + and the DOM tree. It also provides an XML::XPath-like findnodes() interface, providing + access to the XPath API in libxml2. + [...] + + 2. This xupdate attempts to implement the XUpdate specs using XSLT only. + + +=head3 Yet another xupdate - facts in short: + + S: It would be nice to have a pure perl thingy which does (almost) the same stuff.... + + Q: Can we achieve compliance with its (XML::XUpdate::LibXML) API? (or just a subset ....) + + Q: Can we achieve the processing using CPAN's XML::XSLT? + S: Proposal: XML::XUpdate::XSLT!? + + Q: Can we mimic/use the interface of the - already established - 'xupdate' program??? + + Q: Should we follow the CRUD path first? (CRUD means: Create, Retrieve, Update, Delete) + S?: Proposal: XML::XUpdate::XSLT::API uses XML::XUpdate::XSLT::CRUD + + +=head4 Todo + + o What about proper encoding? (ISO-8859-1 or UTF-8) + o Is it possible to create the required "xsl_template.xml" at runtime via XSL itself? + o Cache contents of external files (*.xml). Performance! + + =cut @@ -32,6 +83,7 @@ use XML::XSLT 0.41; use Carp; +use File::Basename; use Data::Dumper; # Namespace constants @@ -40,7 +92,7 @@ use vars qw ( $VERSION ); -$VERSION = '0.02'; +$VERSION = '0.01'; ###################################################################### @@ -54,7 +106,7 @@ $self->{DEBUG} = $args->{debug}; $self->{WARNINGS} = $args->{warnings}; - $self->__init_default_macros(); + $self->__init_default_stylesheets(); return $self; @@ -72,22 +124,10 @@ my $xml = shift; my $options = shift; if ($options->{encap}) { - $xml = qq( - - - - - - - -$xml - - - ); + my $template = $self->__slurp_file("xsl_template.xml"); + # FIXME! What about the quirky? Is there a better one? + $template =~ s!!$xml!; + $xml = $template; } $self->{XML}->{xsl}->{$name} = $xml; } @@ -142,7 +182,6 @@ $self->{XML}->{result} = $self->{XSLT_ENGINE_LIVE}->toString(); } - sub toString { my $self = shift; return $self->{XML}->{result}; @@ -168,81 +207,30 @@ } -sub __init_default_macros { +sub __init_default_stylesheets { my $self = shift; - $self->{XML}->{xsl}->{xupdate2xsl} = qq( - - + if (my $payload = $self->__slurp_file("xupdate2xsl.xml")) { + $self->{XML}->{xsl}->{xupdate2xsl} = $payload; + } +} + +sub __slurp_file { + my $self = shift; + my $filename = shift; - - - - - - - - - - - - - - - - - - - 1. passthru logic - - passthru - - - - * - passthru - - - comment() - passthru - - - - - - - - - - 2. context finder - - - - - - 3. rewrite / vivify elements/attributes - - - - - - - - - - - - - - - + # does file exist? + if (! -e $filename) { + $filename = dirname(__FILE__) . "/$filename"; + if (! -e $filename) { + croak("File $filename does not exist."); + } + } - ); - + open(FH, "<" . $filename); + my @lines = ; + my $content = join("", @lines); + close(FH); + return $content; } 1;