it-swarm.dev

O que o elementFormDefault faz no XSD?

O que elementFormDefault faz e quando deve ser usado?

Então, eu encontrei algumas definições para os valores elementFormDefault:

qualificado - elementos e atributos estão no targetNamespace do esquema

não qualificado - elementos e atributos não possuem um espaço para nome

Portanto, a partir dessa definição, eu pensaria que, se um esquema estiver definido como qualificado, por que você deve prefixar o tipo com o namespace? E quais são os cenários que você definiria como não qualificado para esse assunto? Eu tentei pesquisar no Google, mas tudo o que consegui foram algumas páginas do W3C extremamente difíceis de entender.

Este é o arquivo com o qual estou trabalhando agora, por que preciso declarar o tipo como target:TypeAssignments quando declaro o targetNamespace como o mesmo que xmlns:target?

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns" 
        elementFormDefault="qualified">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignments" type="target:TypeAssignments"
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="TypeAssignments">
    <sequence>
      <element name="assignment" type="target:assignmentInfo"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
      <element name="page" type="target:TypePage"/>
      <element name="file" type="target:TypeFile" 
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
  <simpleType name="TypePage">
    <restriction base="integer">
      <minInclusive value="50" />
      <maxInclusive value="498" />
    </restriction>
  </simpleType>
  <simpleType name="TypeFile">
    <restriction base="string">
      <enumeration value=".xml" />
      <enumeration value=".dtd" />
      <enumeration value=".xsd" />
    </restriction>
  </simpleType>
</schema>
80
Levi

O ElementFormDefault não tem nada a ver com o namespace dos tipos no esquema, trata-se dos namespaces dos elementos nos documentos XML que estão em conformidade com o esquema.

Aqui está a seção relevante das especificações:

Element Declaration Schema

Component Property  {target namespace}
Representation      If form is present and its ·actual value· is qualified, 
                    or if form is absent and the ·actual value· of 
                    elementFormDefault on the <schema> ancestor is qualified, 
                    then the ·actual value· of the targetNamespace [attribute]
                    of the parent <schema> element information item, or 
                    ·absent· if there is none, otherwise ·absent·.

O que isso significa é que o targetNamespace que você declarou na parte superior do esquema se aplica apenas a elementos no documento XML compatível com o esquema se elementFormDefault for "qualificado" ou se o elemento for declarado explicitamente no esquema como tendo form = "qualificado" .

Por exemplo: Se elementFormDefault não for qualificado -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>

colocará os elementos "name" esperados no targetNamespace e os elementos "page" no namespace nulo.

Para poupar a necessidade de colocar form = "qualificado" em cada declaração de elemento, declarar elementFormDefault = "qualificado" significa que o targetNamespace se aplica a cada elemento, a menos que seja substituído por colocar form = "não qualificado" na declaração do elemento.

67
Alohci

Considere o seguinte ComplexType AuthorType usado pelo elemento author

<xsd:complexType name="AuthorType">
  <!-- compositor goes here -->
  <xsd:sequence>
     <xsd:element name="name" type="xsd:string"/>
     <xsd:element name="phone" type="tns:Phone"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>

Se elementFormDefault="unqualified"

seguir a Instância XML é válido

<x:author xmlns:x="http://example.org/publishing">
   <name>Aaron Skonnard</name>
   <phone>(801)390-4552</phone>
</x:author>

o atributo name dos autores é permitido sem especificar o espaço para nome (não qualificado). Quaisquer elementos que façam parte de <xsd:complexType> são considerados locais para complexType.

se elementFormDefault="qualified"

a instância deve ter os elementos locais qualificados

<x:author xmlns:x="http://example.org/publishing">
   <x:name>Aaron Skonnard</name>
   <x:phone>(801)390-4552</phone>
</x:author>

consulte this link para mais detalhes

54
Girish

Resposta e explicação novas e detalhadas para uma antiga pergunta freqüente ...

Resposta curta: se você não adicionar elementFormDefault="qualified" a xsd:schema, o valor padrão unqualified significa que os elementos declarados localmente estão em sem espaço para nome.

Há muita confusão sobre o que elementFormDefault faz, mas isso pode ser rapidamente esclarecido com um pequeno exemplo ...

Versão simplificada do seu XSD:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignment" type="target:assignmentInfo" 
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
</schema>

Pontos principais:

  • O elemento assignment é definido localmente.
  • Elementos definidos localmente em XSD não estão em nenhum espaço para nome.
    • Isso ocorre porque o valor padrão para elementFormDefault é unqualified.
    • Isso sem dúvida é um erro de design dos criadores do XSD.
    • A prática padrão é sempre usar elementFormDefault="qualified" para que assignment esteja no espaço de nome de destino, como seria de esperar.

XML aparentemente válido

Esse XML parece que deve ser válido de acordo com o XSD acima:

<assignments xmlns="http://www.levijackson.net/web340/ns"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd">
  <assignment id="a1">
    <name>John</name>
  </assignment>
</assignments>

Aviso:

  • O espaço para nome padrão em assignments coloca assignments e todos os seus descendentes no espaço para nome padrão (http://www.levijackson.net/web340/ns).

Erro de validação desconcertante

Apesar de parecer válido, o XML acima gera o seguinte erro de validação confuso:

[Erro] try.xml: 4: 23: cvc-complex-type.2.4.a: Foi encontrado conteúdo inválido começando com o elemento 'atribuição'. Um dos '{assignment}' é esperado.

Notas:

  • Você não seria o primeiro desenvolvedor a amaldiçoar esse diagnóstico que parece dizer que o conteúdo é inválido porque esperava encontrar um elemento assignment, mas na verdade encontrou um assignment elemento. (WTF)
  • O que isso realmente significa: { e } em torno de assignment significa que a validação estava esperando assignment em nenhum espaço para nome aqui. Infelizmente, quando diz que encontrou um elemento assignment, não menciona que o encontrou em um espaço para nome padrão que não difere de nenhum espaço para nome.

Solução

  • Grande parte do tempo: Adicione elementFormDefault="qualified" ao elemento xsd:schema do XSD. Isso significa que XML válido deve colocar elementos no espaço para nome de destino quando declarado localmente no XSD; caso contrário, o XML válido deve colocar elementos declarados localmente em nenhum espaço para nome.
  • Minoria minúscula do tempo: Altere o XML para atender ao requisito do XSD de que assignment não esteja em nenhum espaço para nome. Isso pode ser alcançado, por exemplo, adicionando xmlns="" ao elemento assignment.
38
kjhughes

É importante observar com o elementFormDefault que ele se aplica a localmente elementos definidos, normalmente denominados elementos dentro de um bloco complexType, em oposição aos elementos globais definidos no top- nível do esquema. Com elementFormDefault = "qualificado", é possível endereçar elementos locais no esquema a partir do documento xml usando o espaço de nome de destino do esquema como o espaço de nome padrão do documento.

Na prática, use elementFormDefault = "qualificado" para poder declarar elementos em blocos aninhados; caso contrário, você precisará declarar todos os elementos no nível superior e consultá-los no esquema em elementos aninhados usando o atributo ref, resultando em um esquema muito menos compacto.

Este bit no XML Schema Primer fala sobre isso: http://www.w3.org/TR/xmlschema-0/#NS

12
stephan f

elementFormDefault = "qualificado" é usado para controlar o uso de espaços para nome nos documentos da instância XML (arquivo .xml), em vez dos espaços para nome no próprio documento do esquema (arquivo .xsd).

Ao especificar elementFormDefault = "qualificada", aplicamos a declaração de namespace a ser usada em documentos validados com este esquema.

É prática comum especificar esse valor para declarar que os elementos devem ser qualificados em vez de não qualificados. No entanto, como attributeFormDefault = "não qualificado" é o valor padrão, ele não precisa ser especificado no documento do esquema, se não desejar qualificar os espaços para nome.

5
Feri

Percebi que o XMLSpy (versão pelo menos 2011) precisa de um targetNameSpace definido se elementFormDefault = "qualificado" for usado. Caso contrário, não será validado. E também não gerará xmls com prefixos de namespace

0
Neal