XSD для одного элемента из группы элементов, предшествующих другому? - PullRequest
2 голосов
/ 04 июня 2019

Дочерние элементы родительского элемента должны иметь один элемент (вне группы), за которым следует другой определенный элемент.

<xsd:element name="elementContainer">
    <xsd:element name="element1">
    <xsd:element name="element2">
    <xsd:element name="element3">
    <xsd:element name="element4">
    <xsd:element name="element5">
    <xsd:element name="element6">
    <xsd:element name="proceedingElement">
</xsd:element>

Я хочу изменить приведенный выше XSD, чтобы в нем был один элемент (1-6), за которым следует исходящий элемент.

Я попытался обернуть выбор между элементамиОт 1 до 6, но это не принимается проверкой.

<xsd:element name="elementContainer">
    <xsd:choice minOccurs="1">
        <xsd:element name="element1">
        <xsd:element name="element2">
        <xsd:element name="element3">
        <xsd:element name="element4">
        <xsd:element name="element5">
        <xsd:element name="element6">
    </xsd:choice>
    <xsd:element name="proceedingElement">
</xsd:element>

Для двух следующих примеров я хотел бы, чтобы первый прошел проверку, а второй потерпел неудачу.

<elementContainer>
    <element2/>
    <proceedingElement/>
</elementContainer>

<elementContainer>
    <proceedingElement/>
</elementContainer>

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

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Другой способ сделать это, который может или не может быть уместным в вашем случае, - это использовать группы подстановок:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > 
  <xsd:element name="elementContainer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="abstractElement"/>
        <xsd:element name="proceedingElement"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="abstractElement" abstract="true"/>

  <xsd:element name="element1" substitutionGroup="abstractElement"/>
  <xsd:element name="element2" substitutionGroup="abstractElement"/>
  ... etc...
</xsd:schema>

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

0 голосов
/ 04 июня 2019

У вас есть правильная основная идея относительно xsd:choice, но с вашим XSD есть множество проблем:

  • xsd:element элементы не закрыты.
  • xsd:complexType и xsd:sequence отсутствуют.

С поправками на вышеуказанные проблемы и пропуском по умолчанию xsd:choice/@minOccurs = 1, это XSD,

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > 
  <xsd:element name="elementContainer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:choice>
          <xsd:element name="element1"/>
          <xsd:element name="element2"/>
          <xsd:element name="element3"/>
          <xsd:element name="element4"/>
          <xsd:element name="element5"/>
          <xsd:element name="element6"/>
        </xsd:choice>
        <xsd:element name="proceedingElement"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

потребует наличия одного из element1 - element6, за которым следует один proceedingElement, как и требовалось.

...