2010-08-23 65 views
4

我有一個架構,在這裏我試圖包含/導入沒有名稱空間的另一架構(這不能更改,因爲它來自另一個供應商,它不會更長時間驗證他們的XML)。這是第一個模式:如何將XML架構導入「無命名空間」

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:samp="http://sample/namespace" 
targetNamespace="http://sample/namespace" 
elementFormDefault="unqualified" attributeFormDefault="unqualified" 
xmlns:otr1="http://sample/import/namespace1" 
xmlns:otr2="http://sample/import/namespace2"> 

<xs:import namespace="http://sample/import/namespace1" schemaLocation="other1.xsd" /> 
<xs:import namespace="http://sample/import/namespace2" schemaLocation="other2.xsd" /> 
<!-- This one below is having problems, it is valid XML, and I am able to use it 
but I am not meeting the actual requirments I have (explained later) --> 
<xs:include schemaLocation=="NO_NAME_SPACE_PROBLEM.xsd"/> 

... 
<xs:element ref="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/> 
... 


</xs:schema> 

與「NO_NAME_SPACE_SHEMA_PROBLEM.xsd」,可一定程度上改變,但是它不能有命名空間。

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="unqualified" attributeFormDefault="unqualified"> 

<xsd:element name="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA" 
    type="xsd:string" nillable="true"/> 

</xs:schema> 

的問題是,some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA被放入samp命名空間。因此,當我嘗試將這些信息編碼爲XML時,它會打印出<samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA><child-elem/></samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA>,這是一個大問題,因爲XML不會進行驗證,因爲它不是有意義的。所以我的目標是簡單地將元素導入no命名空間命名空間。

更新1:對於混淆,我當時正在使用xs:include,而不是xs:import作爲無名稱空間模式。問題語法已更新。我也使用JiBX codegen生成域對象和JiBX綁定進行編組。所以它也必須是JiBX兼容的。

更新2:根據skaffman的回答,我現在將使用xs:import。我想我會把它分解成一個新問題。

+0

你需要非常清楚'import'和'include'之間的區別,他們做了大不相同的事情。 – skaffman 2010-08-23 18:42:35

+0

是的,我很抱歉,我的意思是早些時候能夠達到這個目標,但是在我能夠回到我的鍵盤之前就被阻止了。 – Zombies 2010-08-23 18:46:17

回答

3

你試過

<xs:import namespace="" schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/> 

有趣的是,XML模式規範strongly suggests

<xs:import schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/> 

應導入NO_NAME_SPACE_PROBLEM.xsd進入 「沒有命名空間」。如果您的環境是將其導入到封閉架構文檔的名稱空間中,那麼我很確定這是您平臺中的錯誤。


更新:OK,你的更新說你正在嘗試使用<xs:include>引用類型不同的命名空間。您不能這樣做 - <xs:include>總是將包含的項目與父架構文檔置於相同的名稱空間中。如果它們用於不同的名稱空間,則必須使用<xs:import>

如果要引用導入的no名稱空間模式中的某個元素定義,那麼您需要找到一種爲「no namespace」命名空間分配前綴的方法。如果它有一個前綴,你可以參考他們這樣的:

<xs:element ref="nn:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/> 

嘗試添加屬性xmlns:nn=""父架構文檔,看看是否能工程。

+0

@skaffman:我已經更新了我的答案,對於混淆抱歉。我也試過''但現在''無法解析元素ref 。 – Zombies 2010-08-23 18:37:19

+0

@殭屍:查看更新的答案。 – skaffman 2010-08-23 18:44:28

+0

@skaffman:你更新的答案是相當讚賞。我現在正在研究這個方向。我現在只是遇到了JiBX的問題,也許我會把它分解成一個新的問題。 – Zombies 2010-08-23 18:48:12