如何在另一个XSD中使用命名空间定义的类型? (通过命名空间引用它)

时间:2016-02-25 11:12:10

标签: xml xsd namespaces xml-namespaces

免责声明:我对XSD不太熟悉,可能会表达自己的错误。

我有一个需要验证和处理的XML文件。我可以更改XSD而不是XML。

XML文件的类型为a.xsd,而a.xsd包含b.xsd中的类型。在引用命名空间的XML中调用此类型,如下所示:

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

XSD的定义如下:

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>

1 个答案:

答案 0 :(得分: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。

在这一点上,要求中存在许多松散的目标和矛盾,这可以提供尽可能多的帮助而不需要过多的猜测。