2016-02-25 170 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

相关问题