example - namespace xml c#
XML espacios de nombres predeterminados para los nombres de atributos no calificados? (3)
Estoy tratando de entender la interpretación correcta de la definición de "Espacios de nombres en XML 1.0 (Tercera edición)" para los espacios de nombres de atributos no calificados.
"El nombre del espacio de nombres para un nombre de atributo sin prefijo no tiene ningún valor".
Y luego en la misma sección:
"El valor del atributo en una declaración de espacio de nombres predeterminada PUEDE estar vacío. Esto tiene el mismo efecto, dentro del alcance de la declaración, de que no haya espacio de nombres predeterminado".
Entonces, si quiero declarar un espacio de nombres predeterminado para un elemento (y sus hijos), ¿también tengo que declarar un mapeo de prefijo-espacio de nombres para los atributos que residen dentro de ese espacio de nombres?
Por ejemplo, en este ejemplo.
<parent xmlns="http://example.com/foo">
<child attrib="value">text</child>
<parent>
Interpretaría la definición anterior para decir que el espacio de nombres de attrib
está vacío.
Entonces, si necesitara attrib
para tener el mismo espacio de nombres como parent
, ¿entonces me verían forzado a hacer esto?
<foo:parent xmlns:foo="http://example.com/foo">
<foo:child foo:attrib="value">text</foo:child>
<foo:parent>
¿o esto?
<parent xmlns="http://example.com/foo" xmlns:foo="http://example.com/foo">
<child foo:attrib="value">text</child>
<parent>
Esto me parece una tontería, ya que parece anular el propósito de los espacios de nombres predeterminados. Espero que estoy malinterpretando la especificación.
Estás en lo correcto. La idea de que los atributos no formen parte del espacio de nombres predeterminado es que se considera que existen en un "espacio de nombres de elementos", por lo que en este caso, <foo:child/>
se considera el "espacio de nombres" para @attrib
. Tenga en cuenta que esto es sólo conceptual; no hay API ni nada que se refiera a los espacios de nombres de atributos de esta manera.
Se eligió esto porque varios elementos pueden tener atributos con los mismos nombres, pero con significados diferentes, a diferencia de un espacio de nombres tradicional, que es un conjunto de nombres (por lo tanto, no hay duplicados). En cierto modo, le da más estructura al espacio de nombres, en lugar de tener un conjunto plano.
Puedes leer sobre esto en una versión muy antigua de la recomendación de espacios de nombres .
Esta convención significa que cada vez que vea un atributo prefijado, representa información "adicional" que no está relacionada con el esquema principal en el documento.
Según la especificación, es correcto considerar que el espacio de nombres del attrib
en el primer ejemplo está vacío. Sin embargo, aquí hay una sutileza que puede no ser tan evidente.
Considere este ejemplo más abajo en la especificación de un elemento con dos atributos con el mismo nombre (uno con prefijo y otro sin prefijo).
<!-- This is OK, even though an element cannot have two attributes
with the same name -->
<x xmlns:n1="http://www.w3.org"
xmlns="http://www.w3.org" >
<good a="1" n1:a="2" />
</x>
Esto es conforme porque los dos atributos están de hecho en dos espacios de nombres diferentes:
-
n1:a
pertenece al espacio de nombreshttp://www.w3.org
(que también es el espacio de nombres degood
) -
a
se trata de pertenecer a un espacio de nombres inaccesiblehttp://wwww.w3.org > good
(y diferente del espacio de nombres degood
).
Tenga en cuenta que http://wwww.w3.org > good
espacio de nombres no existe; por ejemplo, no puede consultar atributos en este espacio de nombres con XPath. Si solicita namespace-uri(//good/a)
, estará vacío. Para concretar la idea de un espacio de nombres de elementos separado, inventé un espacio de nombres que tiene tanto el espacio de nombres del elemento como su nombre junto con un separador ( >
todos modos no se permite que salga sin escape en los valores de los atributos).
Ahora, en lugar de decir que los dos atributos están en dos espacios de nombres diferentes, es más correcto decir que pertenecen a dos particiones de espacio de nombres diferentes:
-
n1:a
atributo pertenece a la partición de atributos globales (http://www.w3.org
) -
good
elementogood
pertenece a la Partición de todos los tipos de elementos (tambiénhttp://www.w3.org
) -
a
pertenece al tipo Por elemento Partition Ofgood
(es decir,http://wwww.w3.org > good
).
Aquí está la parte relevante de la especificación Porges vinculada a:
A.2 Particiones de espacios de nombres XML
Con el fin de apoyar el objetivo de hacer que los nombres calificados y no calificados sean útiles para cumplir con el propósito previsto, identificamos los nombres que aparecen en un espacio de nombres XML como pertenecientes a uno de varios espacios de nombres tradicionales separados (es decir, estructurados por conjuntos), denominados particiones de espacio de nombres. Las particiones son:
La partición Todos los tipos de elementos Todos los tipos de elementos en un espacio de nombres XML aparecen en esta partición. Cada uno tiene una parte local única; La combinación del nombre del espacio de nombres y la parte local identifica de forma única el tipo de elemento.
La partición de atributos globales Esta partición contiene los nombres de todos los atributos que se definen, en este espacio de nombres, como globales. La única característica requerida de un atributo global es que su nombre sea único en la partición de atributo global. Esta especificación no hace afirmaciones sobre el uso adecuado de dichos atributos. La combinación del nombre del espacio de nombres y el nombre del atributo identifica de forma única el atributo global.
Las particiones por tipo de elemento Cada tipo en la partición Todos los tipos de elementos tiene un espacio de nombres asociado en el que aparecen los nombres de los atributos no calificados que se proporcionan para ese elemento. Este es un espacio de nombres tradicional porque la aparición de nombres de atributos duplicados en un elemento está prohibida por XML 1.0. La combinación del nombre del atributo con el tipo del elemento y el nombre del espacio de nombres identifica de manera única cada atributo no calificado.
En los documentos XML que cumplen con esta especificación, los nombres de todos los atributos calificados (con prefijo) se asignan a la partición de atributo global, y los nombres de todos los atributos no calificados se asignan a la partición apropiada por tipo de elemento.
Su interpretación de la especificación es correcta. En el segundo párrafo de la sección 6.2 de la especificación de espacios de nombres a los que hace referencia también se proporciona algún tipo de razón:
La interpretación de los atributos sin prefijo está determinada por el elemento en el que aparecen.
Pero también estaría interesado en algunos detalles más sobre por qué se eligió este comportamiento específico.