É possível em linguagem XML Schema do W3C (XSD) para permitir uma série de elementos para estar em qualquer ordem, mas ainda ocorrências limite?

StackOverflow https://stackoverflow.com/questions/104248

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu sei sobre all e choice, mas eles não representam um caso onde eu quero alguns elementos para ser capaz de ocorrer mais de uma vez, como:

<Root>
    <ThingA/>
    <ThingB/>
    <ThingC/>
    <ThingC/>
    <ThingC/>
</Root>

Eu poderia usar sequence, mas eu prefiro a permitir que estas crianças para estar em qualquer ordem. Eu poderia usar any, mas então eu não poderia ter mais de um ThingC. Eu poderia usar choice, mas então eu não podia ThingA limite e ThingB a 0 ou 1.

Eu acho que pode ter um lugar de leitura que este era difícil ou impossível em XSD, mas pode ser possível com RELAX NG. Eu não me lembro onde li que, infelizmente.

Obrigado por qualquer ajuda!

Foi útil?

Solução

Isso mesmo: você não pode fazer o que você quer fazer em XML Schema, mas você pode em RELAX NG com:

<element name="Root">
  <interleave>
    <element name="ThingA"><empty /></element>
    <element name="ThingB"><empty /></element>
    <oneOrMore><element name="ThingC"><empty /></element></oneOrMore>
  </interleave>
</element>

As suas opções em XML Schema são:

  • adicionar uma etapa de pré-processamento que normaliza o XML de entrada em uma ordem particular, e então usar <xs:sequence>
  • uso <xs:choice>, e adicionar validação adicional (por exemplo, usando Schematron) para verificar que não há mais do que um <ThingA> ou <ThingB>
  • decidir fixar a ordem dos elementos em sua linguagem de marcação

Acontece que o terceiro é geralmente a melhor opção; há geralmente não muito custo para geradores de XML para elementos de saída em uma ordem específica, e não só a validação ajuda, mas ela também ajuda consumo do XML se a ordem pode ser conhecido com antecedência.

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