warum fehler in validierung gegen xsd mit include in Subdir
vlad
- xml
0 vlad
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
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.