vlad: XML hierarchische XML-Schema mit key/keyref

Beitrag lesen

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?