XSD - Расширить XSD, затем добавить пользовательские вложенные элементы - PullRequest
0 голосов
/ 24 мая 2018

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

<message>
    <common1>value1</common1>
    <common2>value2</common2>
    <common3>
        <unique1>hello</unique1>
    </common3>
    <common4>
        <unique2>bye</unique2>
    </common4>
</message>

или

<message>
    <common1>value1</common1>
    <common2>value2</common2>
    <common3>
        <unique3>hey</unique3>
    </common3>
    <common4>
        <unique4>goodbye</unique4>
    </common4>
</message>

Поскольку я вижу, что они имеют общие элементы и только уникальные вложенные элементыЯ хочу создать родителя-родителя, который xsd может расширять, чтобы я мог просто беспокоиться об уникальных полях, но у меня все еще нет идеи о том, как определить common3 или 4 на родительском уровне, поэтому я определил его на дочернем xsdsчто я считаю неправильным, может кто-нибудь проверить и пролить свет на это?

parent.xsd:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="message">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="common1" type="xs:string"/>
          <xs:element name="common2" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
</xs:schema>

и

child1.xsd:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="parent.xsd"/>
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="message">
                <xs:sequence>
                    <xs:element name="common3" type="common3Type" />
                    <xs:element name="common4" type="common4Type" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="common3Type">
      <xs:sequence>
          <xs:element name="unique1" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    <xs:complexType name="common4Type">
      <xs:sequence>
          <xs:element name="unique2" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:schema>

и

child2.xsd:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="parent.xsd"/>
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="message">
                <xs:sequence>
                    <xs:element name="common3" type="common3Type" />
                    <xs:element name="common4" type="common4Type" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="common3Type">
      <xs:sequence>
          <xs:element name="unique3" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    <xs:complexType name="common4Type">
      <xs:sequence>
          <xs:element name="unique4" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:schema>

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете использовать расширение с ограничением для XML-схемы, чтобы у вас было общее определение для common3 и common4 в супертипе, а затем ограничить эти определения для ваших сообщений child1 и child2подтипы, соответственно:

<!-- message.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="message">
    <xs:sequence>
      <xs:element name="common1" type="xs:string"/>
      <xs:element name="common2" type="xs:string"/>
      <xs:element name="common3" type="xs:anyType" minOccurs="0"/>
      <xs:element name="common4" type="xs:anyType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="message-subtype-a">
    <xs:complexContent>
      <xs:restriction base="message">
        <xs:sequence>
          <xs:element name="common1" type="xs:string"/>
          <xs:element name="common2" type="xs:string"/>
          <xs:element name="common3" type="common3-subtype-a" minOccurs="1"/>
          <xs:element name="common4" type="common4-subtype-a" minOccurs="1"/>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="message-subtype-b">
    <xs:complexContent>
      <xs:restriction base="message">
        <xs:sequence>
          <xs:element name="common1" type="xs:string"/>
          <xs:element name="common2" type="xs:string"/>
          <xs:element name="common3" type="common3-subtype-b" minOccurs="1"/>
          <xs:element name="common4" type="common4-subtype-b" minOccurs="1"/>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="common3-subtype-a">
    <xs:sequence>
      <xs:element name="unique1" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="common4-subtype-a">
    <xs:sequence>
      <xs:element name="unique2" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="common3-subtype-b">
    <xs:sequence>
      <xs:element name="unique3" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="common4-subtype-b">
    <xs:sequence>
      <xs:element name="unique4" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>

Примечание. Здесь я поместил все определения типов в один файл схемы.Для объявления элементов вам по-прежнему нужны две схемы для соответствующих подтипов сообщений, поскольку вы хотите, чтобы оба сообщения содержались в элементе message:

<!-- message-a.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:include schemaLocation="message.xsd"/>
  <xs:element name="message" type="message-subtype-a"/>
</xs:schema>

и

<!-- message-b.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:include schemaLocation="message.xsd"/>
  <xs:element name="message" type="message-subtype-b"/>
</xs:schema>

При использовании деривации по ограничению необходимо повторить модель содержимого для каждого отдельного подтипа, как описано в Ограничение схемы XML для сложных типов: полное переопределение? одним из авторов схемы XMLспецификация.

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