¿Qué hace elementFormDefault
y cuándo debe usarse?
Entonces encontré algunas definiciones de elementFormDefault
valores:
calificado : los elementos y atributos están en el targetNamespace del esquema
no calificado : los elementos y atributos no tienen un espacio de nombres
Entonces, a partir de esa definición, pensaría que si un esquema está configurado como calificado, ¿por qué debe prefijar el tipo con el espacio de nombres? ¿Y cuáles son los escenarios en los que incluso tendrías uno configurado como no calificado para el caso? Intenté buscar en Google, pero todo lo que obtuve 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 que targetNamespace
es 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>
Considere el siguiente ComplexType
AuthorType
usado porauthor
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). Los elementos que forman parte de
<xsd:complexType>
se consideran locales de 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.
fuente
Respuesta y explicación nuevas y detalladas a una pregunta antigua y frecuente ...
Respuesta corta : Si no se agrega
elementFormDefault="qualified"
axsd:schema
, el valor por defectounqualified
valor significa que los elementos declarados localmente están en ningún espacio de nombres .Hay mucha confusión con respecto a 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:
assignment
elemento está definido localmente.elementFormDefault
esunqualified
.elementFormDefault="qualified"
modo queassignment
esté en el espacio de nombres de destino como cabría esperar.form
atributo de uso poco frecuente enxs:element
declaraciones para las queelementFormDefault
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>
Darse cuenta:
assignments
lugaresassignments
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:
Notas:
assignment
elemento, pero en realidad encontró unassignment
elemento. ( WTF ){
y}
alrededorassignment
significa que la validación no se esperabaassignment
en ningún espacio de nombres aquí. Desafortunadamente, cuando dice que encontró unassignment
elemento, no menciona que lo encontró en un espacio de nombres predeterminado que difiere de ningún espacio de nombres.Solución
elementFormDefault="qualified"
alxsd: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.assignment
no haya espacio de nombres. Esto se puede lograr, por ejemplo, agregandoxmlns=""
alassignment
elemento.Créditos: Gracias a Michael Kay por sus útiles comentarios sobre esta respuesta.
fuente
Es importante tener en cuenta que elementFormDefault es que se aplica a elementos definidos localmente , normalmente elementos con nombre dentro de un bloque complexType, a diferencia de los elementos globales definidos en el nivel superior del esquema. Con elementFormDefault = "calificado" puede abordar elementos locales en el esquema desde dentro del documento xml utilizando el espacio de nombres de destino del esquema como el 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 hacer referencia a ellos en el esquema en elementos anidados utilizando el atributo ref, lo que da como resultado un esquema mucho menos compacto.
Este bit en XML Schema Primer habla de ello: http://www.w3.org/TR/xmlschema-0/#NS
fuente
elementFormDefault = "calificado" 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", aplicamos la declaración de espacio de nombres para que se utilice en documentos validados con este esquema.
Es una práctica común especificar este valor para declarar que los elementos deben estar calificados en lugar de no calificados. Sin embargo, dado que attributeFormDefault = "unqualified" es el valor predeterminado, no es necesario especificarlo en el documento de esquema, si no se desea calificar los espacios de nombres.
fuente
He notado que XMLSpy (al menos la versión 2011) necesita un targetNameSpace definido si se usa elementFormDefault = "calificado". De lo contrario, no se validará. Y tampoco generará xmls con prefijos de espacio de nombres
fuente