XML-схема для элементов с тем же именем, но с разными подэлементами - PullRequest
1 голос
/ 01 июля 2010

То, что я хочу создать, - это один XSD, который подтвердит оба следующих параметра:

<parent>
 <mother>
  <name>
   <firstname>foo</firstname>
   <surname> bar </surname>
   <maidenname>rab</maidenname>
  </name>
 </mother>
</parent>

и

<parent>
 <father>
  <name>
   <firstname>foo</firstname>
   <surname> bar </surname>
  </name>
 </father>
</parent>

В идеале я хочуиспользуйте одно и то же имя элемента, но предъявляйте к нему разные требования в зависимости от родительского атрибута.То, что я пробовал до сих пор:

    <?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="firstname">
    <xs:complexType mixed="true" />
  </xs:element>

  <xs:element name="maidenname">
    <xs:complexType mixed="true" />
  </xs:element>

  <xs:element name="mother">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="father">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="name">
    <xs:complexType>
      <xs:all>
        <xs:element ref="firstname" />
        <xs:element ref="surname" />
        <xs:element ref="maidenname" />
      </xs:all>
    </xs:complexType>
  </xs:element>

  <xs:element name="parent">
    <xs:complexType>
    <xs:choice>                                
        <xs:element ref="mother"/>
        <xs:element ref="father"/>
    </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name="surname">
    <xs:complexType mixed="true" />
  </xs:element>

</xs:schema>

1 Ответ

0 голосов
/ 01 июля 2010

Вы можете создать два разных типа (например, fathersName и mothersName) и использовать их для соответствующих элементов name. Вот полный XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="firstname">
    <xs:complexType mixed="true" />
  </xs:element>

  <xs:element name="maidenname">
    <xs:complexType mixed="true" />
  </xs:element>

  <xs:element name="mother">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="mothersName" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="father">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="fathersName" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="fathersName">
    <xs:all>
      <xs:element ref="firstname" />
      <xs:element ref="surname" />
    </xs:all>
  </xs:complexType>

  <xs:complexType name="mothersName">
    <xs:all>
      <xs:element ref="firstname" />
      <xs:element ref="surname" />
      <xs:element ref="maidenname" />
    </xs:all>
  </xs:complexType>

  <xs:element name="parent">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="mother"/>
        <xs:element ref="father"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name="surname">
    <xs:complexType mixed="true" />
  </xs:element>

</xs:schema>

Кроме того, если имена должны быть простыми строками, вы можете написать XSD более кратким способом:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="mother">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="mothersName" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="father">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="fathersName" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="fathersName">
    <xs:all>
      <xs:element name="firstname" type="xs:string" />
      <xs:element name="surname" type="xs:string" />
    </xs:all>
  </xs:complexType>

  <xs:complexType name="mothersName">
    <xs:all>
      <xs:element name="firstname" type="xs:string" />
      <xs:element name="surname" type="xs:string" />
      <xs:element name="maidenname" type="xs:string" />
    </xs:all>
  </xs:complexType>

  <xs:element name="parent">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element ref="mother"/>
        <xs:element ref="father"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

Наконец, вы можете написать mothersName как расширение fathersName, но это связано с расходами: порядок элементов должен быть (хотя бы частично) фиксированным. Вот как будут выглядеть определения двух типов:

  <!-- ... -->

  <xs:complexType name="fathersName">
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" />
      <xs:element name="surname" type="xs:string" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="mothersName">
    <xs:complexContent>
      <xs:extension base="fathersName">
        <xs:sequence>
          <xs:element name="maidenname" type="xs:string" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- ... -->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...