2012-12-06 13 views
6

Biorąc pod uwagę najwyższy poziom xsd, który importuje drugi poziom, który z kolei importuje trzecią, czy możliwe jest użycie typu od trzeciego w pierwszym? A może pierwszy musi zaimportować trzecią bezpośrednio?użyj typu z xsd importowanego z importu

Odpowiedz

1

Jeśli type to co mówisz wtedy .. To <xs:Include> nie <xs:Import> ..

A odpowiedź brzmi: Parser dba o połączenie wszystkich XSD razem

patrz poniższy przykład:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <child>trial</child> 
    <child2>trial2</child2> 
    <trunk> 
    <branch>1</branch> 
    <branch>2</branch> 
    </trunk> 
    <specialchild>test</specialchild> 
</root> 

na powyższym XML będę zaprojektować xsd:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="include multiple XSDs2.xsd"/> 
    <xs:element name="root" type ="root"/> 
    <xs:complexType name="root"> 
    <xs:sequence> 
     <xs:element name="child" type="xs:string" /> 
     <xs:element name="child2" type="xs:string" /> 
     <xs:element name="trunk" type="trunk"/> 
     <xs:element name="specialchild" type="specialchild"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

gdzie typ bagażnika jest zdefiniowana w import multiple XSDs2.xsd pliku i połączone za pomocą <xs:include> .. (który przebywa w tym samym folderze) .. i kod wygląda następująco:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="include multiple XSDs3.xsd"/> 
    <xs:complexType name="trunk"> 
    <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="branch" type="branch" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

i typ oddziału jest prosty typ zdefiniowany w include multiple XSDs3.xsd pliku, a kod wygląda następująco:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:simpleType name="branch"> 
    <xs:restriction base="xs:string"/> 
    </xs:simpleType> 
    <xs:simpleType name="specialchild"> 
    <xs:restriction base="xs:string"/> 
    </xs:simpleType> 
</xs:schema> 

* teraz najtrudniejsza część jest: specialchild jest zadeklarowana w XSD_1 gdzie jako zdefiniowane w XSD_3 i te dwa XSD są połączone przez XSD_2 .. Można zauważyć, że analizator składniowy domyślnie zajmuje się łączeniem wszystkich XSD i traktowaniem ich jako jednego! *

Mam nadzieję, że to rozwiąże Twoje pytanie!

3

Dobre pytanie! Odczytując specyfikację, nie mogę powiedzieć. Nie odnosi się jednoznacznie wprost do kwestii tranzytywnego importu.

W Primer (część 0), mówią tylko o jeden poziom importu: http://www.w3.org/TR/xmlschema-0/#import

struktury (część 1), a jedynie określa również bezpośrednim importem http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#composition-schemaImport Ponieważ mówi o „sposobu na rozwiązanie takich element obcy "(co moim zdaniem oznacza przestrzeń nazw), być może rozsądne jest założenie, że potrzebny jest wyraźny sposób zaadresowania zaimportowanych schematów - innymi słowy, do każdego z nich potrzebna jest jawna przestrzeń nazw w imporcie.

wyszukiwania Google pokazuje, że inni ludzie również zdezorientowany tym numerze:

Co najbardziej niepokojące o tych stanowisk jest, że różne procesory xsd mają różne zachowanie - sugerując, że pisarze procesorów również byli zdezorientowani.

Chociaż mogło się to zmienić od czasu tych postów (2002, 2005), najmądrzejszym rozwiązaniem wydaje się uniknięcie problemu, a po prostu użycie bezpośredniego importu, ponieważ będzie to działało ze wszystkimi procesorami.

Jak już powiedziałem: dobre pytanie.


Oto test, aby sprawdzić procesor xsd (oczywiście, to nie gwarantuje, że będzie pracować dla kogoś innego za pomocą innego procesora xsd ...). Zauważyłem, że mój ulubiony (xmllint) nie zezwala na przechodnie import.

Test jest trzy schematy: a.xsd import b.xsd który importu kolei c.xsd; oraz typ zdefiniowany w c.xsd odwołuje się od a.xsd:

<!-- a.xsd --> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.c.com" targetNamespace="http://www.a.com"> 
    <xsd:import namespace="http://www.b.com" schemaLocation="b.xsd"/> 
<!-- UNCOMMENT FOR DIRECT IMPORT 
    <xsd:import namespace="http://www.c.com" schemaLocation="c.xsd"/> 
--> 
    <xsd:element name="eg" type="c:TypeC"/> 
</xsd:schema> 

<!-- b.xsd --> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:import namespace="http://www.c.com" schemaLocation="c.xsd"/> 
</xsd:schema> 

<!-- c.xsd --> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.c.com"> 
    <xsd:simpleType name="TypeC"> 
     <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 
</xsd:schema> 


<!-- a.xml --> 
<eg xmlns="http://www.a.com">hello world</eg> 

$ xmllint --schema a.xsd a.xml --noout 
a.xsd:6: element element: Schemas parser error : Element 
'{http://www.w3.org/2001/XMLSchema}element', attribute 'type': References from 
this schema to components in the namespace 'http://www.c.com' are not allowed, 
since not indicated by an import statement. 
WXS schema a.xsd failed to compile 

komunikat o błędzie jest: References from this schema to components in the namespace 'http://www.c.com' are not allowed, since not indicated by an import statement., co sugeruje, że twórcy xmllint przynajmniej są pewni, że przywóz nie są przechodnie.