Pregunta

¿ elementFormDefault hacer, y cuándo debe utilizarse?

Por lo que he encontrado algunas definiciones para elementFormDefault valores:

calificado - elementos y atributos en el targetNamespace de la esquema

sin calificar - elementos y los atributos no tienen un espacio de nombres

Así que a partir de esa definición yo pienso que si un esquema es establecer calificados, entonces ¿por qué debe usted prefijo del tipo con el espacio de nombres?Y cuáles son los escenarios que usted podría incluso tener un conjunto a no cualificado para que la materia?He intentado buscar en Google, pero todo lo que obtuve fueron un par de páginas del W3C, que eran muy difíciles de entender.

Este es el archivo con el que estoy trabajando ahora mismo, ¿por qué tengo que declarar el tipo como target:TypeAssignments cuando declaro la targetNamespace como el mismo que el de 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>
¿Fue útil?

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 cumplan 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 esto significa es que el targetNamespace que se ha declarado en la parte superior del esquema sólo se aplica a los elementos en el documento XML compatible esquema si bien elementFormDefault es "calificado" o el elemento se declara explícitamente en el esquema como el que mostraba forma = "cualificado".

Por ejemplo: Si no está calificado elementFormDefault -

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

pondrá esperar elementos de "Nombre" para estar en el targetNamespace y elementos "página" de estar en el espacio de nombres nulo.

Para evitar que tenga que poner la forma = "cualificado" en cada declaración de elemento, indicando elementFormDefault = "calificado" significa que el targetNamespace se aplica a cada elemento menos que se anule poniendo forma = "sin reservas" en la declaración de elemento.

Otros consejos

Considere el siguiente AuthorType ComplexType utilizado por 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"

a continuación, siguiendo Instancia XML es válido

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

atributo de nombre de los autores se deja sin especificar el espacio de nombres (no calificada). Todos los elementos que son una parte de <xsd:complexType> se consideran como local para complexType.

Si elementFormDefault="qualified"

A continuación, la instancia debe tener los elementos locales calificaron

<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 más detalles

Nueva respuesta detallada y explicación a un viejo, preguntas frecuentes...

Respuesta corta:Si no añade elementFormDefault="qualified" a xsd:schema, entonces el valor predeterminado unqualified valor significa que localmente elementos declarados en ningún espacio de nombres.

Hay mucha confusión acerca de lo que elementFormDefault no, pero esto puede ser rápidamente aclaró con un breve ejemplo...

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

Puntos clave:

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

Aparentemente XML Válido

Este XML se ve como debería ser válido de acuerdo a lo anterior XSD:

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

Desconcertante De Error De Validación

A pesar de que buscan válido, el sobre XML, produce el siguiente confuso error de validación:

[Error] trate.xml:4:23:cvc-complejo-tipo.2.4.una:Contenido no válido fue encuentra comenzando con el elemento 'asignación'.Uno de los '{asignación}' es se esperaba.

Notas:

  • No sería la primera desarrollador de la maldición de este diagnóstico que parece decir que el contenido no es válido porque esperaba encontrar un assignment elemento, pero en realidad encontrar un assignment elemento. (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í.Por desgracia, cuando dice que ha encontrado una assignment elemento, no menciona que se encontró en un espacio de nombres predeterminado, lo cual difiere de ningún espacio de nombres.

Solución

  • Gran mayoría de las veces: Agregar elementFormDefault="qualified" a la xsd:schema elemento de la XSD.Esto significa XML válido, debe colocar los elementos en el espacio de nombres de destino cuando declarados localmente en el XSD;de lo contrario, XML válido debe colocar localmente elementos declarados en ningún espacio de nombres.
  • Pequeña minoría de la época: Cambiar el XML para cumplir con el XSD del el requisito de que assignment será en ningún espacio de nombres.Esto puede lograrse, por ejemplo, mediante la adición de xmlns="" a la assignment elemento.

Es importante señalar con elementFormDefault es que se aplica a local elementos definidos, los elementos típicamente nombrados dentro de un bloque tipoCompuesto, en oposición a los elementos globales definidas en el nivel superior del esquema. Con elementFormDefault = "calificado" se puede hacer frente a los elementos locales en el esquema desde el documento XML utilizando espacio de nombres del esquema como espacio de nombres por defecto del documento.

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

Este bit en las conversaciones de esquemas XML Primer respecto: http://www.w3.org/TR / xmlschema-0 / # NS

elementFormDefault = "cualificado" se utiliza para controlar el uso de espacios de nombres en documentos de instancia XML (archivo .xml), en lugar de espacios de nombres en el documento de esquema en sí (archivo .xsd).

Al especificar elementFormDefault = "calificado" hacemos cumplir la declaración de espacio de nombres que se utilizarán en los documentos validados con este esquema.

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

Me he dado cuenta de que XMLSpy (versión al menos 2011) necesita un targetNamespace definido si se usa = "calificado" elementFormDefault. De lo contrario no va a validar. Y tampoco generará XMLs con prefijos de espacio de nombres

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top