Pergunta

É válido ter uma 'escolha' ou elementos 'grupo' ao definir um esquema XML (XSD)

i. é o seguinte válido

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:group ref="ReservationGroup" />
      <xs:group ref="CancellationGroup"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

Quando uma mensagem XML pode representar, por exemplo, ou uma nova reserva ou cancelamento de uma reserva existente.

Se a mensagem é para uma reserva, em seguida, ele deve incluir todos os elementos definidos no grupo ReservationGroup.

Se for um cancelamento, então ele deve incluir todos os elementos definidos no grupo CancellationGroup.

Por alguma razão, meu editor XML (Eclipse) não faz assim, mas não indica o porquê. Ele mostra a existência de um erro na linha mas não diz qual é o erro

Foi útil?

Solução

Não sou especialista em XML, embora o use bastante.Não é assim que eu geralmente faria esse tipo de estrutura.Eu preferiria tipos complexos separados em vez de uma escolha de dois grupos (veja o final desta resposta).

Suspeito que o problema é que ReservationGroup e CancellationGroup começam com o mesmo elemento; nesse caso, você violará a restrição do componente do esquema:Atribuição Única de Partículas (abaixo).

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cos-nonambig

Restrição do componente do esquema:Atribuição única de partículas

Um modelo de conteúdo deve ser formado de modo que, durante · validação · de uma sequência de itens de informação de elemento, o componente de partículas contido diretamente, indiretamente ou · implicitamente · com o qual tentar · validar · cada item na sequência, por sua vez, pode ser determinado exclusivamente sem examinar o conteúdo ou atributos desse item, e sem nenhuma informação sobre os itens no restante da sequência.

Observação: Essa restrição reconstrói para o esquema XML as restrições equivalentes de [XML 1.0 (segunda edição)] e SGML.Dada a presença de grupos de substituição de elementos e curingas, a expressão concisa dessa restrição é difícil, consulte a análise da restrição de atribuição de partículas únicas (não normativa) (§H) para uma discussão mais aprofundada.

Por exemplo, os dois grupos abaixo são ilegais na mesma escolha, porque cada um dos seus primeiros elementos é "nome", o que significa que você não pode identificar qual grupo está olhando.No entanto, é o primeiro elemento do ReserringGroup é diferente do grupo de cancelamento (talvez resdate e cancdate), então o que é válido.

Editar: Nunca tinha me deparado com este tipo de problema antes, e acho fascinante que as definições dos grupos sejam totalmente legais, mas se as juntarmos numa escolha, essa escolha torna-se ilegal por causa da definição de cada grupo.

Grupos que não podem formar uma escolha legal

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

Grupos que podem formar uma escolha legal

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="resDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="cancDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

Como mencionei acima, eu faria esse tipo de coisa com tipos complexos.Sim, acrescenta outro elemento, mas parece o caminho óbvio e gosto da obviedade.

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:element name="reservation" type="ReservationType" />
      <xs:element name="cancellation" type="CancellationType" />
    </xs:choice>
  </xs:sequence>
</xs:complexType>

Outras dicas

Sim.Isso ocorreu porque tanto o ReservationGroup quanto o CancellationGroup tinham o mesmo primeiro elemento - um elemento 'tipo de reserva' com um valor fixo de 'Reservation' no ReservationGroup e 'Cancellation' no Cancellationgroup respectivamente.

Se isso é válido depende do conteúdo dos grupos:se forem grupos de modelos de 'sequência' ou 'escolha', é perfeitamente legal;'todos' os grupos de modelos são mais problemáticos e geralmente não são permitidos neste caso.

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