初学XML Schema:具有Attribute + Type的元素

时间:2010-06-28 15:35:20

标签: xml validation schema xsd

让我们来看看我的测试.xsd:

    <!-- lot of stuff... -->
<xsd:element name="root">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="target:child"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:element name="child">
    <xsd:complexType>
            <xsd:attribute name="childAttribute" type="myType"/>
    </xsd:complexType>
</xsd:element>
    <!-- lot of stuff... -->

这里一切都很好。只有一个问题:我的“孩子”元素没有类型!我不知道如何给元素一个类型。我尝试过:

<xsd:element name="child" type="xsd:myType2">
    <xsd:complexType>
            <xsd:attribute name="childAttribute" type="myType"/>
    </xsd:complexType>
</xsd:element>

<xsd:element name="root">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="target:child" type="xsd:myType2"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

但它不起作用。始终存在错误消息: “元素'子元素'不能同时具有type属性和simpleType / complexType类型的子元素[xml]]”

我该如何解决这个问题?我的意思是没有类型验证器不允许像这样的xml:

 你好,世界

只允许一个空子项具有一个属性

 

有人有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

如消息所示

- 您不能在一个元素中同时具有类型引用和内联定义。您必须定义“独立类型”并使用type属性引用它或使用内联定义。一个例子如下:

<!-- inline definition -->
<xsd:element name="child">
    <xsd:complexType>
            <xsd:attribute name="childAttribute" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>

<!-- typed definiotion -->
<xsd:complexType name="typeForChild">
    <xsd:attribute name="childAttribute" type="xsd:string"/>
</xsd:complexType>

<xsd:element name="child" type="typeForChild" />

此外,您似乎在xsd命名空间中引用了自定义类型(myType2),这是错误的。声明时的类型不会成为xsd命名空间的一部分;它们位于当前shema的targetNamespace中(因此您可以使用任何前缀引用它们)。另一方面,我使用xsd:string,因为它是在shema的本机命名空间中定义的类型(在您的示例中为xsd)。