2015-06-30 83 views
3

我在Request.xsd中定義了架構,它將引用common.xsd。 我期待的輸出應是如下XSD命名空間「ns2」問題

<Request xmlns="http://ws.myref.com/schemas/test" 
     xmlns="http://ps.myref.com/schemas/2008/Common"> 
<EmailList> 
    <Mail>[email protected]</Mmail> 
    </EmailList> 
</Request> 

但我發現了額外的命名空間「NS2」的問題。任何人都可以幫我解決這個問題

<ns2:Request xmlns:ns2="http://ps.myref.com/schemas/test" 
      xmlns="http://ps.myref.com/schemas/Common"> 
    <ns2:EmailList> 
     <Mail>[email protected]</Mail> 
    </ns2:EmailList> 
</ns2:Request> 

Request.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified" targetNamespace="http://ps.myref.com/schemas/schemas/test" 
      xmlns="http://ps.myref.com/schemas/schemas/test" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:com="http://ps.myref.com/schemas/Common"> 
    <xsd:import namespace="http://ps.myref.com/schemas/Common" schemaLocation="../schemas/common/common.xsd"/> 
    <xsd:element name="Request"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="EmailLists" type="com:EmailList" minOccurs="0" maxOccurs="1"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

Common.xsd

<?xml version="1.0"?> 
<xsd:schema xmlns="http://ps.myref.com/schemas/2008/Common" elementFormDefault="unqualified" 
      targetNamespace="http://ps.myref.com/schemas/Common" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsd:complexType name="EmailList"> 
     <xsd:sequence> 
      <xsd:element name="Mail" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

回答

3

你的期望是在這種情況下是不合理的。

由於類型「EmailList」是在common.xsd文件中的命名空間http://ps.myref.com/schemas/2008/Common下定義的,因此您沒有其他選擇,只能在某種情況下使用另一個模式中的EmailList類型進行區分。如果你看一下request.xsd,你可以看到,這是exectyly這裏所發生:

<xsd:element name="EmailLists" type="com:EmailList" /> 

在這種情況下,com:是設計用來顯示該類型是在另一個模式下不同的命名空間中定義的前綴到正在使用的人。

以同樣的方式,當xsd驗證程序使用request.xsd驗證模式實例時,它必須確保在您的實例中使用的EmailList類型與Common中定義的EmailList類型相同。 xsd模式,它可以做到這一點的唯一方式是使用命名空間。

您的期望,因此可以這樣概括:

「我應該能夠無區別地他們和解析器應該明白,自由地混合在一起,在兩個不同的模式定義定義類型」

因此,您應該能夠看到您的期望如何不符合邏輯意義。

如果您不希望「NS2:」在那裏,你的唯一選擇就是要做到這一點:

<Request xmlns"http://ps.myref.com/schemas/test"> 
    <EmailList xmlns"http://ps.myref.com/schemas/test"> 
     <Mail xmlns="http://ps.myref.com/schemas/Common">[email protected]</Mail> 
    </EmailList> 
</Request>