Неупорядоченный список элементов, включая выбор между 1 элементом и последовательностью из 3 других элементов - PullRequest
1 голос
/ 26 июля 2011

У меня есть XML, который может быть таким:

<profile>
  <docname>Bla bla bla</docname>
  <author>Bubi</author>
  <doctype>INVOICE</doctype>
</profile>

или как это:

<profile>
  <author>Bubi</author>
  <docname>Bla bla bla</docname>
  <type1>3</type1>
  <type2>1</type2>
  <type3>0</type3>
</profile>

Элементы могут появляться в любом порядке. Как видите, необходимо иметь теги <doctype> или <type1>, <type2> и <type3>.

Мне нужен XSD для этого. Я пробовал с

<xs:element name="profile">
  <xs:complexType>
    <xs:all>
      <xs:element type="xs:string" name="author"/>
      <xs:element type="xs:string" name="docname"/>
      <xs:choice>
        <xs:element type="xs:string" name="doctype"/>
        <xs:sequence> <!--another little problem: I'd like to put a <xs:all> but is not allowed...-->
          <xs:element type="xs:byte" name="type1"/>
          <xs:element type="xs:byte" name="type2"/>
          <xs:element type="xs:byte" name="type3"/>
        </xs:sequence>
      </xs:choice>
    </xs:all>
  </xs:complexType>
</xs:element>

Но <xs:choice> не допускается внутри <xs:all> (, почему <xs:all> так плохо обращаются ??? ). Я нашел это замечательное родственное решение , но оно работает только в том случае, если выбор сделан среди отдельных элементов, а не среди их групп.

Кто-нибудь знает обходной путь? Большое спасибо!

1 Ответ

0 голосов
/ 20 августа 2011

Основная проблема здесь связана с уникальной атрибуцией частиц.Если у вас есть варианты, вам может помочь схема Relax NG.В противном случае вам придется дополнить «более слабый» XSD (сделать xsd: все из всех ваших шести элементов) другими механизмами (простой XSLT или рукописный код и т. Д.).

...