¿Qué hace elementFormDefault en XSD?


¿Qué hace elementFormDefault y cuándo debe usarse?

Así que encontré algunas definiciones para elementFormDefault valores:

Qualified - elementos y atributos en el targetNamespace de la esquema

Sin reservas - elementos y los atributos no tienen un espacio de nombres

Así que a partir de esa definición, pensaría que si un esquema se establece en calificado, ¿por qué debe anteponer el tipo con el espacio de nombres? Y cuáles son los escenarios que usted incluso tendría un conjunto de no calificado para el caso? Intenté Googlear, pero todo lo que conseguí fueron un par de páginas del W3C que eran extremadamente difíciles de entender.

Este es el archivo con el que estoy trabajando en este momento, ¿por qué necesito declarar el tipo como target:TypeAssignments cuando declaro el targetNamespace como el mismo 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>
Author: kjhughes, 2009-09-23

6 answers

ElementFormDefault no tiene nada que ver con los espacios de nombres de los tipos en el esquema, se trata de los espacios de nombres de los elementos en 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·.

Esto significa 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 documento XML schema as having form = "qualified".

Por ejemplo: Si elementFormDefault no está calificado -

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

Pondrá los elementos expect "name" en el espacio targetNamespace y los elementos "page" en el espacio de nombres null.

Para evitar tener que poner form="qualified" en cada declaración de elemento, indicando elementFormDefault="qualified" significa que el targetNamespace se aplica a cada elemento a menos que se anule poniendo form="unqualified" en la declaración de elemento.

 63
Author: Alohci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-23 00:25:31

Considere el siguiente tipo complejo AuthorType utilizado por el 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"/>

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 nombre de los autores está permitido sin especificar el espacio de nombres(no calificado). Cualquier elemento que forme parte de <xsd:complexType> se considera local 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>

Por favor refiérase este enlace para más detalles

 52
Author: Girish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-02 08:39:13

Nueva y detallada respuesta y explicación a una vieja pregunta frecuente...

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

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

Versión simplificada 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>

Clave puntos:

  • El elemento assignment está definido localmente.
  • Los elementos definidos localmente en XSD no están en ningún espacio de nombres por defecto.
    • Esto se debe a que el valor predeterminado para elementFormDefault es unqualified.
    • Esto podría ser un error de diseño de los creadores de XSD.
    • La práctica habitual es utilizar siempre elementFormDefault="qualified" así que assignment está en el espacio de nombres de destino como uno esperar.

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 coloca 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.r: El contenido no válido fue encontrado a partir de elemento 'asignación'. Uno de '{asignación} ' es previsto.

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 elemento assignment, pero en realidad encontró un elemento assignment. (WTF )
  • Lo que esto realmente significa: El { y } alrededor de assignment significa que la validación se esperaba assignment en ningún espacio de nombres aquí. Desafortunadamente, cuando dice que encontró un elemento assignment, no menciona que lo encontró en un espacio de nombres predeterminado que difiere de ningún espacio de nombres.

Solución

  • La mayor parte del tiempo: Agrega elementFormDefault="qualified" al elemento xsd:schema del XSD. Esto significa que XML válido debe colocar elementos en el espacio de nombres de destino cuando se declare localmente en el XSD; de lo contrario, XML válido debe colocar elementos declarados localmente en ningún espacio de nombres.
  • Minúscula minoría de los tiempo: Cambiar el XML para cumplir con los XSD requisito de que assignment no esté en ningún espacio de nombres. Esto se puede lograr, por ejemplo, añadiendo xmlns="" al elemento assignment.
 18
Author: kjhughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 00:33:39

Importante tener en cuenta con elementFormDefault es que se aplica a localmente elementos definidos, típicamente llamados elementos dentro de un bloque complexType, a diferencia de los elementos globales definidos en el nivel superior del esquema. Con elementFormDefault= "qualified" puede abordar elementos locales del esquema desde el documento xml utilizando el espacio de nombres de destino del esquema como espacio de nombres predeterminado del documento.

En la práctica, use elementFormDefault= "qualified" para poder declarar elementos en bloques anidados, de lo contrario tendrá que declarar todos los elementos en el nivel superior y referirse a ellos en el esquema en elementos anidados utilizando el atributo ref, lo que resulta en un esquema mucho menos compacto.

Este bit del primer Esquema XML habla de ello: http://www.w3.org/TR/xmlschema-0/#NS

 12
Author: stephan f,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-17 15:28:01

ElementFormDefault="qualified" se usa para controlar el uso de espacios de nombres en documentos de instancia XML (.xml), en lugar de espacios de nombres en el propio documento de esquema (.archivo xsd).

Al especificar elementFormDefault="qualified" aplicamos la declaración de espacio de nombres para ser utilizada en documentos validados con este esquema.

Es práctica común especificar este valor para declarar que los elementos deben estar calificados en lugar de no calificados. Sin embargo, desde attributeFormDefault= "unqualified" es el valor predeterminado, no necesita ser especificado en el documento de esquema, si uno no quiere calificar los espacios de nombres.

 5
Author: Feri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-04 21:17:51

He notado que XMLSpy(al menos la versión 2011)necesita un targetNamespace definido si se utiliza elementFormDefault="qualified". De lo contrario no se validará. Y tampoco generará xmls con prefijos de espacio de nombres

 0
Author: Neal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-22 09:52:52