XSD 与使用 targetNamespace 的分离复杂类型



我写了一个非常简单的XML:

<?xml version="1.0" encoding="utf-8"?>
<something attribute1="21" attribute2="23">
<newelement code="code1"/>
</something>

我想编写一个 XSD 来验证这个 XML,它运行良好:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="something">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="newelement" nillable="true">
<xs:complexType>
<xs:attribute type="xs:string" name="code"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="attribute1" type="xs:int"/>
<xs:attribute name="attribute2" type="xs:int"/>
</xs:complexType>
</xs:element>
</xs:schema>

但是后来我想编写相同的 XSD,但使用单独的复杂类型,因为例如,如果我需要与newelement现在相同的结构怎么办。所以我以这种方式重构了我的 XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="my-common-types"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="my-common-types">
<xs:element name="something">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="newelement" nillable="true" type="tns:ElementWithCode"/>
</xs:sequence>
<xs:attribute name="attribute1" type="xs:int"/>
<xs:attribute name="attribute2" type="xs:int"/>
</xs:complexType>
</xs:element>
<xs:complexType name="ElementWithCode">
<xs:attribute name="code" type="xs:string"/>
</xs:complexType>
</xs:schema>

然后,我总是收到此错误:

错误:元素"某物":没有匹配的全局声明可用 为验证根。

因此,在方案中使用targetNamespace属性存在问题,但我不明白如何使其工作。请给我一些建议。谢谢!

重构的架构适用于命名空间"my-common-types",而原始架构适用于没有命名空间。如果希望元素不在命名空间中,则(全局(元素声明必须位于没有targetNamespace的架构文档中。如果需要,您仍然可以将类型声明放在命名空间中,但它们必须位于单独的架构文档中,该文档使用xs:import导入到无命名空间架构文档中。

XML 和 XSD 中都缺少部分。

XML 缺少<something>元素中的xmlns="my-common-types"属性。

XSD 缺少<xs:schema>元素中的elementFormDefault="qualified"属性。

相关内容

  • 没有找到相关文章

最新更新