XML esquema construto para “qualquer um ou mais desses elementos, mas deve ser pelo menos um”

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Estou tentando configurar parte de um esquema que é como uma "sequência" em que todos os elementos filhos são opcionais, mas pelo menos um dos elementos devo estar presente, e pode haver mais de um deles.

Eu tentei fazer o seguinte, mas o XMLSPY reclama que "o modelo de conteúdo contém os elementosu003Celement name="DateConstant"> eu003Celement name="DateConstant"> que não pode ser determinado exclusivamente. ":

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

Isso pode ser feito? Se sim, como)?

Alguns esclarecimentos: eu só quero permitir um de cada elemento com o mesmo nome. Pode haver um "DataConstant" e/ou um "Timeconstant", mas não dois. A resposta do Gizmo atende aos meus requisitos, mas é impraticável para um número maior de elementos. A resposta de Hurst permite dois ou mais elementos com o mesmo nome, que eu não quero.

Foi útil?

Solução

Experimente isso:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

Fazendo isso, você força a escolher o primeiro elemento e, em seguida, o restante é opcional, o segundo elemento e o restante é opcional, ou o terceiro elemento.

Isso deve fazer o que você quiser, espero.

Obviamente, você pode colocar as sub-seqüências em grupos, para evitar duplicar um elemento em cada sequência, se perceber que sente falta de um.

Outras dicas

De acordo com o artigo técnico no MSDN intitulado Entendendo o esquema XMLno http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5você pode aproveitar as restrições como minoccurs Na própria definição de escolha (compositor):

"Usar restrições de ocorrência em um compositor se aplica a todo o grupo como um todo"

(Veja o exemplo mais sofisticado que usa tipos complexos aninhados e o exemplo do autortype)

Você declarou sua exigência como "pelo menos um dos elementos deve estar presente e pode haver mais de um deles". Assim, proponho que você tente o seguinte:

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

@hurst,

Infelizmente, você não conseguiu entender a pergunta original. Colocar Minoccurs = "1" na opção é satisfeito automaticamente quando todos os elementos que possuem Minoccurs = "0" estão contidos como opções.

Assim, você não conseguiu explicar o "pelo menos um" exigido pelo pôster original, porque nenhum elementos satisfaz corretamente 1 ocorrência de dois elementos completamente opcionais.

Até agora, não consigo encontrar uma solução para isso, pois o Minoccur/Maxoccur se relaciona com o grupo em que são definidos e não se relacionam com um número geral de nós. Nem você pode usar o elemento de escolha para definir o mesmo elemento nomeado mais de uma vez ou se torna "ambíguo". Vi alguns exemplos usarem referências em vez de elementos de um tipo específico, mas acredito que isso falha no analisador Microsoft XSD.

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

Aqui você pode ver que você tem a primeira sequência (que deve ter o Elem1, mas pode ter o elem2 opcionalmente), ou você tem a segunda sequência (que deve ter elem2).

Portanto, agora você tem "qualquer um ou mais" desses 2 elementos. É claro que isso fica exponencialmente mais complexo quanto mais opções você tiver, pois você precisa fornecer opções adicionais para todas as combinações possíveis.

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