Проблемы расширения схемы XSD с любыми элементами - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть приложение, которое пытается проверить следующий 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>

Как видите, вторая схема расширяет первую схему для добавления нового дочернего элемента в элемент элемент.На этом этапе я обнаружил некоторые проблемы:

  1. Если расширенный элемент введен неправильно (например, gere вместо genre )валидатор не выдает никакой ошибки.Я знаю, что это связано с тем, что в качестве значения атрибута processContents всех элементов any используется lax, но я не должен изменять схему contacts.xsd .Итак, могу ли я как-то обойти это поведение?

  2. Можно ли каким-то образом контролировать, где добавляются расширенные элементы?Потому что, если я добавлю элемент personal-info как дочерний элемент повестки дня , валидатор скажет, что документ действителен, и я хочу, чтобы этот элемент отображался только как дочерний элемент запись .

Примечание: я не могу использовать версию XSD 1.1

Заранее спасибо

1 Ответ

0 голосов
/ 23 ноября 2018

Я не уверен, считается ли «нет» ответом, но я не думаю, что есть простое решение любой проблемы.Вы можете попытаться изменить данную схему, не изменяя ее по-настоящему, используя xs: redefine, но лично я ненавижу эту функцию и нахожу гораздо предпочтительнее модифицировать предоставленную схему как исходный документ (возможно, контролируя процесс, делая повторяемость изменений с помощьютаблица стилей XSLT).

...