Может ли XSD определить подстановочный комплексный тип? - PullRequest
4 голосов
/ 15 мая 2011

Скажите, что я не знаю, как будет называться элемент, но я знаю, что это будут дети. Например, имена «foo» и «bar» не прописаны, а «A», «B» и «C»:

<example>
    <foo>
        <A>A</A>
        <B>B</B>
        <C>C</C>
    </foo>
    <bar>
        <A>A</A>
        <B>B</B>
        <C>C</C>
    </bar>
</example>

Я не могу пропустить атрибут name, потому что это нарушение. Я ожидаю, что смогу сделать это вместо этого:

<xs:element name="example">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:any>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="A" type="xs:string"/>
                        <xs:element name="B" type="xs:string"/>
                        <xs:element name="C" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:any>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Это также не работает, <xs:any> может содержать только аннотации и отказывается от типа.

Что я могу сделать с пространствами имен, которые будут работать с неизвестными именами элементов? Должен ли я сдаться, а не пытаться утвердить детей и просто задокументировать, каким должно быть содержимое?

Ответы [ 2 ]

3 голосов
/ 16 мая 2011

Вы можете попробовать сделать это с группами подстановки :

<xs:element name="example">
  <xs:sequence>
    <xs:element ref="ABCSequence" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:element>

<xs:element name="ABCSequence" abstract="true" type="ABCSeq" />
<xs:complexType name="ABCSeq">
  <xs:complexContent>
    <xs:sequence>
      <xs:element name="A" type="xsd:string" />
      <xs:element name="B" type="xsd:string" />
      <xs:element name="C" type="xsd:string" />
    </xs:sequence>
  </xs:complexContent>
</xs:complexType>

<xs:element name="foo" substitutionGroup="ABCSequence" type="ABCSeq" />
<xs:element name="bar" substitutionGroup="ABCSequence" type="ABCSeq" />

Я не уверен, что это позволит добавлять произвольные внешние элементы без объявления их типов (через xsi:type атрибутов), но он по крайней мере позволяет описать тип документа, который вы ищете.

0 голосов
/ 16 мая 2011

Вы не можете достичь того, что хотите сделать в XML-схеме.Существует близкое решение, но не совсем то, что вам нужно:

<xs:element name="example">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:any namespace="##other" processContents="lax"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Теперь вы можете предоставить отдельные схемы для элементов, которые могут там присутствовать, например, одну для foo, в отдельном пространстве имен и вотдельный файл схемы:

<xs:element name="foo">
    <xs:complexType>
        ....
    </xs:complexType>
</xs:element>

Это все, что вы можете сделать (это ваше решение для "нескольких пространств имен").Вы не можете избежать перечисления элементов полностью.Если этого недостаточно, то <xsd:any> с processContents, установленным на skip, является единственным решением, за которым следует внешняя проверка (код, Schematron и т. Д.)

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