Pergunta

Eu preciso de sua ajuda para definir um caso especial no esquema XML: Uma sequência que contém dois elementos: 'x' e 'y' enquanto que:

  • elemento <x> pode aparecer a 0 vezes não ligados na sequência

  • elemento <y> pode aparecer 0-1 tempo na sequência

  • locais <x> e <y> pode estar em qualquer lugar -. Ou seja, é possível ter momentos não ligados ao elemento <x> e, em seguida, um único elemento <y>, e tempos depois não ligados ao elemento <x>

exemplos XML deste problema:

Exemplo # 1

<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

Exemplo # 2

<y>stuff</y>
<x>stuff</x>
<x>stuff</x>

Exemplo # 3

<x>stuff</x> 
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

Obrigado!

Foi útil?

Solução

Por várias razões, nenhum dos Yuval de, Mo ou amostras de trabalho de davidsheldon. Aqui está um que faz.

    <xs:complexType name="myComplexType">
    <xs:sequence>
        <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        <xs:sequence minOccurs="0">
            <xs:element name="y" type="xs:string"/>
            <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:sequence>
    </xs:complexType>

Outras dicas

EDIT: Como Alohci mencionado, a minha solução é incorreta. De acordo com a especificação, um elemento em xs: all só pode aparecer zero ou uma vez. Desculpe por qualquer inconveniente

Eu acho que o que você quer não é uma sequência. Uma sequência define não apenas os elementos, mas também a fim. E no seu caso a ordem pode mudar. Já experimentou xs: Todas

<xs:complexType name="myComplexType">
  <xs:all>
    <xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
    <xs:element name="y" type="xs:string" maxOccurs="1"/>
  </xs:all>
</xs:complexType>

Outra appraoch poderia ser a de torná-lo uma sequência, mas marcar a seqüência de ser maxOccurs="unbounded"

Tem sido um tempo desde que eu usei esquema, mas acho que sequências são aqui a sua resposta.

Você precisa ter um número ilimitado de opções entre (um x), ou (a y seguido por um x).

<xsd:element name="parent">
  <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="x" type="xs:string"/>
      <xsd:sequence>
        <xsd:element name="y" type="xsd:string" />
        <xsd:element name="x" type="xsd:string" />
      </xsd:sequence>
    </xsd:choice>
  </xsd:complexType>  
</xsd:element>  

Não é muito complicado. Em cima da minha cabeça, deve ser algo como isto:

<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 

Uma vez que cada elemento no XSD é opcional por padrão, este XSD irá corresponder a estrutura XML que você definiu, com o elemento y aparecendo em qualquer lugar antes, depois ou entre os elementos x, com uma ocorrência máximo de 1

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top