使用targetNamespace分离复杂类型的XSD

时间:2018-10-14 08:39:26

标签: xml xsd xml-namespaces xml-validation

我写了一个非常简单的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属性存在问题,但我不知道如何使它起作用。请给我一些建议。谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

XML和XSD都缺少一些部分。

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

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