As Matt mentioned,
XML::SAX::ByRecord
from the
XML::SAX::Machines
distribution might be
useful here. Make sure you get at least
XML-SAX-Machines-0.31,
I fixed a bug in X::S::ByRecord to get this example working <:-/>.
ByRecord is designed for handling record oriented
XML files one record at a time. It splits the document
apart in to individual documents, one per record, and
runs them through a pipeline of SAX processors,
merging the resulting subdocuments back in to the body
of the output document. Everything that's not a record
is passed through verbatim. This should make things a bit
easier on the old memory banks, reduce time to first output,
and make it possible to use simpler stylesheets.
Here's a recipe that might get you started. It copys only the
<state> records through to the output (the StateML file
I fed it has several different record types). Feel free
to email me and/or the perl-xml list if you have questions.
use XML::SAX::Machines 0.31;
use XML::SAX::Machines qw( Pipeline ByRecord Tap );
use XML::Filter::XSLT;
my $f =XML::Filter::XSLT->new( Source => { ByteStream => \*DATA } );
Pipeline(
ByRecord( $f ),
\*STDOUT
)->parse_uri( $ARGV[0] );
## "in-place upgrades" until some new releases hit CPAN ;)
use IO::Handle; ## XML::LibXML needs this to read from DATA
## and this makes XML::Filter::XSLT machine compliant
sub XML::Filter::XSLT::LibXSLT::set_handler {
my $self = shift;
$self->{Handler} = shift;
$self->{Parser}->set_handler( $self->{Handler} )
if $self->{Parser};
}
__END__
<xslt:transform version="1.0"
xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
>
<xslt:template match="state">
<xslt:copy-of select="."/>
</xslt:template>
</xslt:transform>