Saltar al contenido

¿Qué hace elementFormDefault en XSD?

Solución:

ElementFormDefault no tiene nada que ver con el espacio de nombres de los tipos en el esquema, se trata de los espacios de nombres de los elementos en los documentos XML que cumplen con el esquema.

Aquí está la sección relevante de la especificación:

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·.

Lo que eso significa es que el targetNamespace que ha declarado en la parte superior del esquema solo se aplica a los elementos del documento XML compatible con el esquema si elementFormDefault está “calificado” o si el elemento se declara explícitamente en el esquema con form = “calificado” .

Por ejemplo: si elementFormDefault no está calificado –

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

esperará que los elementos “name” estén en el targetNamespace y los elementos “page” estén en el espacio de nombres nulo.

Para evitar tener que poner form = “calificado” en cada declaración de elemento, indicar elementFormDefault = “calificado” significa que targetNamespace se aplica a cada elemento a menos que se anule poniendo form = “unqualified” en la declaración del elemento.

Considere el siguiente ComplexType AuthorType usado por author elemento

<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"/>

Si elementFormDefault="unqualified"

entonces la siguiente instancia XML es válida

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

el atributo de nombre de los autores está permitido sin especificar el espacio de nombres (no calificado). Cualquier elemento que forme parte de <xsd:complexType> se consideran como locales a complexType.

si elementFormDefault="qualified"

entonces la instancia debe tener los elementos locales calificados

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

Consulte este enlace para obtener más detalles.

Respuesta y explicación nuevas y detalladas a una pregunta antigua y frecuente …

Respuesta corta: Si no agrega elementFormDefault="qualified" para xsd:schema, entonces el predeterminado unqualified valor significa que los elementos declarados localmente están en sin espacio de nombres.

Hay mucha confusión sobre lo que elementFormDefault hace, pero esto se puede aclarar rápidamente con un breve ejemplo …

Versión optimizada de su 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>

Puntos clave:

  • los assignment El elemento está definido localmente.
  • Los elementos definidos localmente en XSD no están en ningún espacio de nombres de forma predeterminada.

    • Esto se debe a que el valor predeterminado para elementFormDefault es unqualified.
    • Podría decirse que esto es un error de diseño de los creadores de XSD.
    • La práctica estándar es usar siempre elementFormDefault="qualified"
      así que eso assignment está en el espacio de nombres de destino como cabría esperar.
  • Es un raramente usado form atributo en xs:element declaraciones para las cuales elementFormDefault establece valores predeterminados.

XML aparentemente válido

Este XML parece que debería ser válido de acuerdo con el XSD anterior:

<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:

  • El espacio de nombres predeterminado en assignments lugares assignments y todos sus descendientes en el espacio de nombres predeterminado (http://www.levijackson.net/web340/ns).

Error de validación desconcertante

A pesar de parecer válido, el XML anterior produce el siguiente error de validación confuso:

[Error] try.xml: 4: 23: cvc-complex-type.2.4.a: Se encontró contenido no válido a partir del elemento ‘asignación’. Se espera uno de ‘{asignación}’.

Notas:

  • No sería el primer desarrollador en maldecir este diagnóstico que parece decir que el contenido no es válido porque esperaba encontrar un assignment elemento, pero en realidad encontró un assignment elemento. (WTF)
  • Lo que esto realmente significa: { y } alrededor assignment significa que la validación estaba esperando assignment en ningún espacio de nombres aquí. Desafortunadamente, cuando dice que encontró un assignment elemento, no menciona que lo encontró en un espacio de nombres predeterminado que difiere de ningún espacio de nombres.

Solución

  • La gran mayoría de las veces: Agregar elementFormDefault="qualified" al xsd:schema elemento del XSD. Esto significa que XML válido debe colocar elementos en el espacio de nombres de destino cuando se declara localmente en el XSD; de lo contrario, XML válido debe colocar elementos declarados localmente en ningún espacio de nombres.
  • Pequeña minoría del tiempo: Cambie el XML para cumplir con el requisito de XSD de que assignment estar en ningún espacio de nombres. Esto se puede lograr, por ejemplo, agregando xmlns="" al assignment elemento.

Créditos: Gracias a Michael Kay por sus útiles comentarios sobre esta respuesta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *