vlad: warum fehler in validierung gegen xsd mit include in Subdir

Hi ich habe hier folgende Konstellation:

Verzeichnis mit xsd.xsd und test.xml
unterverzeichnis TC1.xml

sobal das TC1 in einem anderen als dem gleichen Verzeichnis liegt, bekomme ich folgende Fehlermeldung:

test/TC1.xml:2: Schemas validity error : Element '{http://abc.de}component', attribute '{http://www.w3.org/XML/1998namespace}base': The attribute '{http://www.
w3.org/XML/1998/namespace}base' is not allowed.

xsd:

  
<?xml version="1.0"?>  
<xs:schema  xmlns:xs="http://www.w3.org/2001/XMLSchema"  
            targetNamespace="http://abc.de"  
            xmlns="http://abc.de"  
            elementFormDefault="qualified">  
  
  <xs:element name="module" type="ModuleType"/>  
  
  <xs:complexType name="ModuleType">  
    <xs:sequence>  
      <xs:element name="components" type="ComponentListType" minOccurs="1" maxOccurs="1"/>  
    </xs:sequence>  
  </xs:complexType>  
  
  <xs:complexType name="ComponentListType">  
    <xs:sequence>  
      <xs:element name="component" type="ComponentType" minOccurs="0" maxOccurs="unbounded"/>  
    </xs:sequence>  
  </xs:complexType>  
  
  <xs:complexType name="ComponentType">  
    <xs:attribute name="name" type="xs:string" use="required"/>  
  </xs:complexType>  
</xs:schema>  

  
<module xmlns:xi="http://www.w3.org/2001/XInclude"  
  xmlns="http://abc.de" >  
  
  
  <components>  
    <xi:include href="test/TC1.xml"      />  
  </components>  
</module>  

TC1.xml:

  
<component name="TC1"  
  xmlns="http://abc.de" />  

für die Validierung benutze ich ein Perl-Script mit Strawberry-Perl und der LibXml

  
my $schema_file = shift;  
my $document    = shift;  
  
my $schema = XML::LibXML::Schema->new(location => $schema_file);  
my $parser = XML::LibXML->new;  
  
my $doc    = $parser->parse_file($document);  
$parser->process_xincludes($doc);  
eval { $schema->validate($doc) };  
if($@){  
  print "------------------------------------\n";  
  print $@;  
  print "------------------------------------\n";  
}else{  
  print "$document validated successfully\n";  
}  

Hoffe mir kann jemand helfen, ich weiß langsam echt nicht mehr weiter.
ISt das ein Fehler in der LibXML oder in dem Perl-Modul oder liegt der Fehler bei mir?

Gruß
Vlad

  1. got it:

    xinclude fügt xml:base attribute ein, diese müssenim Kontext erlaubt sein.

    über zahllose Fehlversuche und zwischenschritte bin ich dann hier gelandet:

      
      
    <?xml version="1.0"?>  
    <xs:schema  xmlns:xs="http://www.w3.org/2001/XMLSchema"  
                targetNamespace="http://abc.de"  
                xmlns="http://abc.de"  
                elementFormDefault="qualified">  
      
      <xs:import namespace="http://www.w3.org/XML/1998/namespace"  
                 schemaLocation="xml.xsd"/>  
      
      
      <xs:element name="module" type="ModuleType"/>  
      
      <xs:complexType name="ModuleType">  
        <xs:sequence>  
          <xs:element name="components" type="ComponentListType" minOccurs="1" maxOccurs="1"/>  
        </xs:sequence>  
      </xs:complexType>  
      
      <xs:complexType name="ComponentListType">  
        <xs:sequence>  
          <xs:element name="component" type="ComponentType" minOccurs="0" maxOccurs="unbounded"/>  
        </xs:sequence>  
      </xs:complexType>  
      
      <xs:complexType name="ComponentType">  
        <xs:attribute name="name" type="xs:string" use="required"/>  
        <xs:attributeGroup ref="xml:specialAttrs"/>  
      </xs:complexType>  
    </xs:schema>  
    
    

    hier sollte man beachtem, dass das ich das schema xml.xsd hier lokal begelgt hatte, da ich zugriffsschwierigkeiten auf dem Server hatte

    ier sollte es eigentlich immer liegen: http://www.w3.org/2001/03/xml.xsd

    sollte jemand eine schönere Variante kennen, mit der man global für alle Elemente die specialAttributes erlauben kann, dann immer her damit.

    weiterer Punkt für zukünftige Suchende zu dem Thema:
    test/TC1.xml:1: Schemas validity error : Element '{http://abc.de}component',attribute '{http://www.w3.org/XML/1998/namespace}base': No matching global attribute declaration available, but demanded by the strict wildcard.

    diese Fehlermeldung tritt auf, wenn man einfach nur ein xs:anyAttribute/ einfügt, was das xml:base ja abdecken sollte.