prefijo - ¿Por qué se espera el ''null-namespace'' para un elemento xml que se definió como ''tener'' un espacio de nombres en el esquema?
qué es el xmlns (1)
El siguiente documento xml y el esquema se redujeron a partir de un esquema mucho más grande en el que se produjo primero el problema:
El documento xml:
<f2b:Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f2b="http://www.outerfoospace.com/schemas/foo2bar" xsi:schemaLocation="http://www.outerfoospace.com/schemas/foo2bar f2b-0-0-0.xsd">
<f2b:Bar>text</f2b:Bar>
</f2b:Foo>
El esquema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:f2b="http://www.outerfoospace.com/schemas/foo2bar" targetNamespace="http://www.outerfoospace.com/schemas/foo2bar">
<xs:complexType name="T_Foo">
<xs:sequence>
<xs:element name="Bar" xmlns="f2b"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Foo" type="f2b:T_Foo"/>
</xs:schema>
Cuando valido el documento con el esquema, recibo un mensaje de error en el elemento <f2b:Bar>
que dice que no se espera <f2b:Bar>
. Para que el documento sea válido, tengo que poner el elemento <Bar>
explícitamente (!) En el ''espacio de nombres nulo'': <Bar xmlns="">
. No veo por qué debería esperarse un elemento de espacio nulo. El esquema define un espacio de nombres para todos los elementos y para el elemento <Foo>
espacio de f2b
f2b es realmente esperado por el validador. Pero incluso si configuré explícitamente el espacio de nombres en la definición del elemento <Bar>
como lo hice anteriormente, el validador todavía espera xmlns=""
para el elemento Bar
. Probé varias variaciones del esquema y el documento para encontrar una respuesta sin suerte, y simplemente no puedo adivinar por qué diablos se espera el espacio de nombre nulo en este caso especial.
Cualquier pista apreciada ... ekke
Respuesta corta: agregue elementFormDefault="qualified"
a la raíz xs:schema
tag de su esquema.
Respuesta más larga: de forma predeterminada, solo las declaraciones de elementos "globales" de alto nivel toman el espacio de nombres de destino del esquema. Las declaraciones de elementos "locales" dentro de un tipo complejo no están en ningún espacio de nombres. Puede anular esto para un elemento local particular usando el atributo de form
en la etiqueta xs:element
, o globalmente para todos los elementos que usan elementFormDefault
en el xs:schema
.