У меня есть следующий spml-example.xsd, который определяет элемент команды, который содержит элемент действия:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.myexample.com/command" xmlns:tns="http://www.myexample.com/command"
elementFormDefault="qualified">
<xs:element name="Action" type="tns:ActionType" abstract="true" />
<xs:complexType name="ActionType" abstract="true">
<xs:attribute name="result" type="xs:string" />
</xs:complexType>
<xs:element name="Command">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:Action" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Как видите, действие является абстрактным, поэтому его заменяет конкретная реализация.
Итак, у меня есть два типа действий, которые расширяют это действие:
Первым является spml-test-actions.xsd, который определяет действие чтения:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.myexample.com/actions/data"
xmlns:tns="http://www.myexample.com/actions/data" xmlns:command="http://www.myexample.com/command"
elementFormDefault="qualified">
<xs:import namespace="http://www.myexample.com/command"
schemaLocation="../../spml-example.xsd" />
<xs:element name="read" type="tns:readType"
substitutionGroup="command:Action" />
<xs:complexType name="readType">
<xs:complexContent>
<xs:extension base="command:ActionType">
<xs:attribute name="a" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
вторым является spml-local-actions.xsd, который определяет всплывающее действие:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.myexample.com/actions/local"
xmlns:tns="http://www.myexample.com/actions/local" xmlns:command="http://www.myexample.com/command"
elementFormDefault="qualified">
<xs:import namespace="http://www.myexample.com/command"
schemaLocation="../../spml-example.xsd" />
<xs:element name="popup" type="tns:PopupType"
substitutionGroup="command:Action" />
<xs:complexType name="PopupType">
<xs:complexContent>
<xs:extension base="command:ActionType" >
<xs:attribute name="width" type="xs:float"/>
<xs:attribute name="height" type="xs:float"/>
<xs:attribute name="view" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
обратите внимание, что эти действия находятся в разных пространствах имен .
Теперь я создал следующий экземпляр xml, и он прекрасно работает:
<?xml version="1.0" encoding="UTF-8"?>
<Command xmlns="http://www.myexample.com/command" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:crud="http://www.myexample.com/actions/data"
xmlns:local="http://www.myexample.com/actions/local"
xsi:schemaLocation="http://www.myexample.com/command spml-example.xsd
http://www.myexample.com/actions/data actions/data/spml-test-actions.xsd
http://www.myexample.com/actions/local actions/local/spml-local-actions.xsd">
<local:popup/>
</Command>
но здесь есть странность, теперь, если я добавлю действие crud: read, оно завершится неудачно с сообщением "cvc-complex-type.2.4.a: найден недопустимый контент, начиная с элемента 'crud: read'. Один из '{"http: //
www.myexample.com/command":Action} «ожидается»
Это не означает, что crud: read не в порядке, потому что если сейчас я удалю всплывающее действие local:, xml снова будет действительным, то есть разрешено добавлять только действие из одного пространства имен.
У меня есть решение для этого, которое по конструкции не является правильным, я могу добавить в spml-example.xsd импорт spml-test-actions.xsd и spml-local-actions.xsd.
помогите пожалуйста, спасибо.