NAME
XML::Filter::Conditional
- an XML SAX filter for conditionally ignoring XML content
SYNOPSIS
CODE:
package My::XML::Filter;
use base qw( XML::Filter::Conditional );
sub store_switch
{
my $self = shift;
my ( $e ) = @_;
my $ename = $e->{Attributes}{'{}env'}{Value};
return $ENV{$ename};
}
sub eval_case
{
my $self = shift;
my ( $value, $e ) = @_;
return $value eq $e->{Attributes}{'{}value'}{Value};
}
XML:
<message>
<switch env="USER">
<case value="root">Hello there, root user</case>
<case value="mail">Hello there, mail user</case>
<otherwise>Hello, whoever you are</otherwise>
</switch>
</message>
DESCRIPTION
This module provides an abstract base class to implement a PerlSAX filter which conditionally ignores part of the XML content. The base class provides the implememtation of actually surpressing SAX events for filtering purposes, and delegates the evaluation of matches to the subclassed instance.
The evaluation of the matches is performed by the abstract methods store_switch()
and eval_case()
; see their detail below.
CONSTRUCTOR
$filter = XML::Filter::Conditional->new( %opts )
Takes the following options:
- Handler => OBJECT
-
The PerlSAX handler (or another filter) that will receive the PerlSAX events from this filter.
- SwitchTag => STRING or REGEXP
- CaseTag => STRING or REGEXP
- OtherwiseTag => STRING or REGEXP
-
Changes the tag names used for the
switch
,case
andotherwise
elements. Can be precompiled regexp values instead of literal strings. The values will be matched against the local name of the tag only, ignoring any namespace prefix. - NamespaceURI => STRING
-
If present, the tags will only be recognised if they are part of the given namespace. Defaults to the empty string, meaning tags will only be recognised if they do not have a namespace prefix, and no default namespace was defined for the document.
- MatchAll => BOOLEAN
-
Determines whether all of the matching
<case>
elements will be used, or only the first one that matches. By default, only the first matching one will be used.
ABSTRACT METHODS
The following methods must be implemented by any instance of this class which is constructed.
$value = $self->store_switch( $e )
This method is called when a switch
element is entered. It is passed the PerlSAX node in the $e
parameter. The value it returns, in scalar context, is stored by the object, to pass into any eval_case()
methods which may apply to this element.
This method helps to keep the case evaluations efficient, by allowing the evaluation logic to precompute whatever values it might find useful once, to be reused by the cases themselves. See the SYNOPSIS section for an example.
$bool = $self->eval_case( $value, $e )
This method is called when a case
element is found, to determine whether it should be considered to match. It is passed whatever the earlier store_switch()
method returned as the $value
parameter, and the PerlSAX node as the $e
parameter. It should return a value, whose truth will be used to determine if the case matches.
See the SYNOPSIS section for an example.
SEE ALSO
XML::SAX - Simple API for XML
AUTHOR
Paul Evans <leonerd@leonerd.org.uk>