Hi, ich habe hier zwei schema A und B
A includiert B das andere.
B definiert im top-level element aber ein paar key/keyrefs, die wegen der Beschränkung auf child-elemente im selctor/field nirgends woanders hinkönnen.
A definiert eine Liste mit dem in B definiertem Typen.
allerdings geht dabei die key/ref-Definition verloren, da das toplevel element im includierten Schema nicht beachtet wird:
A.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.abc.de.de"
xmlns="http://www.abc.de.de"
xmlns:ns="http://www.abc.de.de"
elementFormDefault="qualified">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<xs:include schemaLocation="B.xsd"/>
<xs:element name="module" type="ModuleType">
</xs:element>
<xs:complexType name="ModuleType">
<xs:sequence>
<xs:element name="components" type="ComponentListType" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attributeGroup ref="xml:specialAttrs"/>
</xs:complexType>
<xs:complexType name="ComponentListType">
<xs:sequence>
<xs:element name="component" type="ComponentType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attributeGroup ref="xml:specialAttrs"/>
</xs:complexType>
</xs:schema>
B.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.abc.de.de"
xmlns="http://www.abc.de.de"
xmlns:ns="http://www.abc.de.de"
elementFormDefault="qualified">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<xs:element name="component" type="ComponentType">
<xs:keyref name="inputNameKeyRef" refer="inputNameKey">
<xs:selector xpath="ns:inputProcessor/ns:input"/>
<xs:field xpath="@ref"/>
</xs:keyref>
<xs:key name="inputNameKey">
<xs:selector xpath="ns:inputs/ns:input"/>
<xs:field xpath="@name"/>
</xs:key>
</xs:element>
<xs:complexType name="ComponentType">
<xs:sequence>
<xs:element name="inputs" type="InputList" maxOccurs="1"/>
<xs:element name="inputProcessor" type="InputProcessorType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attributeGroup ref="xml:specialAttrs"/>
</xs:complexType>
<xs:complexType name="InputList">
<xs:sequence>
<xs:element name="input" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="type" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="InputProcessorType">
<xs:sequence>
<xs:element name="input" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="ref" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
das xml soll hinterher so aussehen:
main.xml
<module xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns="http://www.abc.de.de"
>
<components>
<xi:include href="test1.xml" />
<xi:include href="test2.xml" />
</components>
</module>
Test1.xml:
<component name="test1"
xmlns="http://www.abc.de.de" >
<inputs>
<input type="Atype" name="input1" />
<input type="AnotherType" name="input2" />
</inputs>
<inputProcessor name="process">
<input ref="input1" />
<input ref="input2" />
</inputProcessor>
</component>
das Problem ist, dass bei der Validierung von main.xml gegen Schema A.xsd die Toplevel-Referenzen aus B.xsd nicht geprüft werden.
wie kann ich das lösen?