2011-06-20 14 views
17

Tengo dos XSD que están definiendo documentos diferentes. Diga 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.XSD con elementos del otro espacio de nombres

Por ejemplo, yo quiero el archivo XML para ElementB tener este aspecto:

<?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 tener este aspecto:

<?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> 

La cosa es que yo realmente no quiero clon la especificación de ElementA en B.xsd, ya que también hay documentos, que solo tienen ElementA como la raíz (es decir, ElementB es algún tipo de documento de contenedor).

Entonces, ¿cómo puedo permitir ElementA dentro de ElementB mientras construyo completamente sobre el XSD ya existente?

Respuesta

29

En realidad, existen 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 nombre del documento que lo contiene es el mismo que el que se referencia, por lo que no es exactamente lo que está buscando. xs: import es mejor para su situación cuando necesita hacer referencia a todos (o a 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: What's the difference between xsd:include and xsd:import?.

De todos modos, volvamos a esta pregunta específica. Lo que probablemente desea 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> 

A pesar de que necesita A.xsd para crear un tipo complejo de elementa que se puede utilizar en B.xsd como se muestra.

Este arcticle tiene algunos buenos ejemplos de información/e incluye una discusión de algunas de las diferentes estrategias de componibilidad: http://www.xfront.com/ZeroOneOrManyNamespaces.html

+0

Gracias, eso se ve bastante bien, lo intentaré. Sin embargo, una pregunta, ¿de dónde viene el prefijo del espacio de nombres 'ea:'? ¿O es ese el 'nombre' que la definición de tipo obtiene en 'A.xsd'? – poke

+0

Simplemente desplácese hacia la derecha en la ventana de código - se hace referencia como el último atributo en el elemento xs: schema: 'xmlns: ea =" http://example.com/namespace/for/ElementA "'. Podría darle el prefijo que desee, al igual que para el espacio de nombre de destino predeterminado (aunque todos siempre eligen 'xs' o' xsd' por convención). – daveaglick

+0

Oh, no me molesté en desplazarme tan lejos y lo perdí, lo siento xD También gracias por tu ayuda, intentaré esto lo antes posible y publicaré mis resultados :) – poke

1

Puede usar la etiqueta <xsd:import> para importar un esquema con otro espacio de nombres.

+2

¿Me puede dar un ejemplo de cómo utilizar estos fondos con el ejemplo anterior? Su enlace realmente no explica eso ... – poke

Cuestiones relacionadas