xml - targetnamespace - XSD con elementos de otro espacio de nombres
xsi schemalocation (2)
En realidad, hay dos formas diferentes de redactar documentos de esquema XML: <xs:import>
y <xs:include>
. xs: include está destinado a ser utilizado cuando el espacio de nombres del documento que contiene es el mismo al que se hace referencia, por lo que no es exactamente lo que está buscando. xs: importar es mejor para su situación cuando necesita hacer referencia a todos (o un subconjunto) de elementos en el esquema al que se hace referencia y están en un espacio de nombres de destino diferente. Aquí hay una pregunta sobre las diferencias: ¿Cuál es la diferencia entre xsd: include y xsd: import? .
De todos modos, volvamos a esta pregunta específica. Lo que probablemente quieras es algo como esto:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns="http://example.com/namespace/for/ElementB"
targetNamespace="http://example.com/namespace/for/ElementB"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:ea="http://example.com/namespace/for/ElementA">
<xs:import namespace="http://example.com/namespace/for/ElementA" schemaLocation="A.xsd" />
<xs:element name="ElementB">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" type="xs:string" />
<xs:element name="bar" type="xs:string" />
<!-- This introduces a element named ElementA that uses the ComplexType ea:ElementA defined in A.xsd -->
<xs:element name="ElementA" type="ea:ElementA" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Aunque necesitará A.xsd para crear un tipo complejo para ElementA que pueda usar en B.xsd como se muestra.
Este artículo tiene buena información / ejemplos e incluye una discusión de algunas de las diferentes estrategias de composición: http://www.xfront.com/ZeroOneOrManyNamespaces.html
Tengo dos XSD que están definiendo documentos diferentes. Say A.xsd
define un elemento ElementA
como la raíz, con algunas reglas complejas. Ahora B.xsd
define un elemento ElementB
que se supone que usa ElementA
en algún punto intermedio.
Por ejemplo, quiero que el archivo XML para ElementB
vea así:
<?xml version="1.0" encoding="utf-8"?>
<ElementB xmlns="http://example.com/namespace/for/ElementB">
<foo>Bla</foo>
<bar>Blub</bar>
<ElementA xmlns="http://example.com/namespace/for/ElementA">
<!-- ... -->
</ElementA>
</ElementB>
Entonces B.xsd
podría verse así:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://example.com/namespace/for/ElementB" targetNamespace="http://example.com/namespace/for/ElementB" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="ElementB">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" type="xs:string" />
<xs:element name="bar" type="xs:string" />
<!-- And now I want to include ElementA somehow -->
<xs:element name="ElementA" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
El problema es que realmente no quiero clonar la especificación de ElementA
en B.xsd
, ya que también hay documentos, que solo tienen ElementA
como raíz (es decir, ElementB
es algún tipo de documento contenedor).
Entonces, ¿cómo puedo permitir que ElementA
dentro de ElementB
se construya completamente sobre el XSD ya existente?
Podría usar la <xsd:import>
para importar un esquema con otro espacio de nombres.