2016-02-25 80 views
0

免責聲明:我對XSD不太熟悉,可能會錯誤地表達自己。如何在另一個XSD中使用命名空間定義的類型? (通過命名空間引用它)

我有我需要驗證和處理XML文件。我可以更改XSD,但不能更改XML。

XML文件的類型爲a.xsd,而a.xsd包含b.xsd的類型。這種類型被稱爲在XML參考命名空間,像這樣:

a.xsd

<!-- language: lang-xml --> 
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema elementFormDefault="qualified" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:supertype="http://www.b.com"> 
<xs:import namespace="http://www.b.com" 
schemaLocation="b.xsd" /> 
<xs:element name="StuffDtl"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="elem1"   type="xs:decimal" /> 
<xs:element name="elem2"   type="xs:int" /> 
<xs:element name="uuuh_special" type="supertype:SuperType" /> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:schema> 

b.xsd

<!-- language: lang-xml --> 
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.b.com" 
elementFormDefault="qualified"> 
<xs:complexType name="SuperType"> 
<xs:sequence> 
<xs:choice> 
<xs:group ref="one_thing" /> 
<xs:group ref="another_thing" /> 
</xs:choice> 
</xs:sequence> 
</xs:complexType> 
<xs:group name="one_thing"> 
<xs:sequence> 
<xs:element name="year" type="xs:decimal" /> 
<xs:sequence minOccurs="0"> 
<xs:element name="hour" type="xs:decimal" /> 
</xs:sequence> 
</xs:sequence> 
</xs:group> 
<xs:group name="another_thing"> 
<xs:sequence> 
<xs:element name="date-value" type="xs:string" /> 
<xs:element name="date-format" type="xs:string" minOccurs="0" /> 
</xs:sequence> 
</xs:group> 
</xs:schema> 

​​

的的XSD是像下面定義

回答

1

如果您確實無法更改XML,請完全停用;它的格式不正確,因爲名稱空間前綴(supertype)未經定義就無法使用。

有關詳細信息,請參見Well-formed vs Valid XML

假設你可以改變XML進行良好的,你可能會保持uuuh_special在一個單獨的命名空間,

<StuffDtl xmlns:supertype="http://www.b.com"> 
    <elem1>test string</elem1> 
    <elem2>9</elem2> 
    <supertype:uuuh_special>test string</supertype:uuuh_special> 
</StuffDtl> 

或者,你可以把它拿出來:

<StuffDtl> 
    <elem1>test string</elem1> 
    <elem2>9</elem2> 
    <uuuh_special>test string</uuuh_special> 
</StuffDtl> 

另外,請注意,您的許多b.xsd與您的XML中的uuh_special元素的內容不一致。所以,大部分b.xsd都沒有用,並且必須重新定義uuh_special,或者再次,您的XML將不得不被修改。

在這一點上,要求中存在如此多的鬆散的結果和矛盾,以至於如果沒有過多的猜測就可以提供多少幫助。

+0

我的情況稍微複雜一些,我試着產生這種「子集」,以便能夠在聲音的交代和一般有用的方式的問題 - 那樣的解釋例子中的空白。但是我很可能會更改XML,使其更簡單。 –

+0

如果您想要進一步的幫助,請將這個答案中提出的鬆散結束:您是​​否希望o'uuuh_special'與XML的其餘部分位於不同的名稱空間中? (不同的名稱空間並不僅僅是用於組合兩個模式的目的。)您是否希望它的內容是XML中所示的字符串或XSD中顯示的元素? – kjhughes

相關問題