XML::DOM::XML_Base - Apply xml:base to attribute values.


  use XML::DOM::XML_Base;
  my $parser = XML::DOM::Parser->new();

  my $xml = qq(
    <ecto x="1" xml:base="a/">
      <meso x="2" xml:base="b/">
        <endo x="3" xml:base="c/"/>

  # build the DOM
  my $dom = $parser->parse( $xml );

  # get some elements
  my $endo = $dom->getElementsByTagName( 'endo' )->item( 0 );
  my $meso = $dom->getElementsByTagName( 'meso' )->item( 0 );
  my $ecto = $dom->getElementsByTagName( 'ecto' )->item( 0 );

  print $endo->getBase()."\n"; # a/b/c/
  print $meso->getBase()."\n"; # a/b/
  print $ecto->getBase()."\n"; # a/

  print $endo->getAttributeWithBase( 'x' )."\n"; # a/b/c/3
  print $meso->getAttributeWithBase( 'x' )."\n"; # a/b/2
  print $ecto->getAttributeWithBase( 'x' )."\n"; # a/1


XML::DOM::XML_Base implements the W3C XML Base specification as an extension to XML::DOM.

XML Base spec ( says: The rules for determining the base URI can be summarized as follows (highest priority to lowest):

  [1] The base URI is embedded in the document's content.
  [2] The base URI is that of the encapsulating entity (message, document, or none).
  [3] The base URI is the URI used to retrieve the entity.
  [4] The base URI is defined by the context of the application.

Rules [1] and [2] and handled by this module by recursively examining parent nodes for xml:base attributes, and returning the first constructable absolute URI, or the relative URI constructed at the end of the recursion (i.e. at the root XML element).

Rules [3] and [4] are outside the scope of what XML::DOM::XML_Base is capable of, as an XML::DOM::Document can be constructed without a URI (e.g. from a string or filehandle).



XML Base Specification (

XML Base Tutorial (


Allen Day, <>


Copyright (C) 2006 by Allen Day

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.3 or, at your option, any later version of Perl 5 you may have available.