xmlns targetnamespace significa schemalocation que minoccurs xml xsd xml-namespaces

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.