У меня есть приложение, которое пытается проверить следующий XML:
<?xml version="1.0" encoding="UTF-8"?>
<cnt:agenda xmlns:cnt="urn:ppp:contacts"
xmlns:cnt2="urn:ppp:contactsv2"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:ppp:contactsv2 contactsv2.xsd urn:ppp:contacts contacts.xsd ">
<cnt:entry>
<cnt:number>12345678</cnt:number>
</cnt:entry>
<cnt:entry>
<cnt:number>12345678</cnt:number>
<cnt2:personal-info>
<cnt2:genre>male</cnt2:genre>
<cnt2:age>30</cnt2:age>
</cnt2:personal-info>
</cnt:entry>
</cnt:agenda>
Для этого у меня есть две схемы XSD:
contacts.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
targetNamespace="urn:ppp:contacts"
xmlns="urn:ppp:contacts"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="agenda">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="entry" type="entry-type"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="entry-type">
<xs:sequence>
<xs:element name="display-name" type="xs:string" minOccurs="0"/>
<xs:element name="number" type="xs:string"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:schema>
и contactsv2.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:ppp:contactsv2"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cnt2="urn:ppp:contactsv2"
xmlns:cnt="urn:ppp:contacts"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:import namespace="urn:ppp:contacts" schemaLocation="contacts.xsd"/>
<!-- Child of entry element -->
<xs:element name="personal-info"
type="cnt2:personal-infoType" />
<xs:complexType name="personal-infoType">
<xs:sequence>
<xs:element name="genre"
type="xs:string" />
<xs:element name="age" type="xs:unsignedByte" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Как видите, вторая схема расширяет первую схему для добавления нового дочернего элемента в элемент элемент.На этом этапе я обнаружил некоторые проблемы:
Если расширенный элемент введен неправильно (например, gere вместо genre )валидатор не выдает никакой ошибки.Я знаю, что это связано с тем, что в качестве значения атрибута processContents всех элементов any используется lax, но я не должен изменять схему contacts.xsd .Итак, могу ли я как-то обойти это поведение?
Можно ли каким-то образом контролировать, где добавляются расширенные элементы?Потому что, если я добавлю элемент personal-info как дочерний элемент повестки дня , валидатор скажет, что документ действителен, и я хочу, чтобы этот элемент отображался только как дочерний элемент запись .
Примечание: я не могу использовать версию XSD 1.1
Заранее спасибо