让我们来看看我的测试.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:
你好,世界
只允许一个空子项具有一个属性
有人有什么想法吗? 谢谢!
答案 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)。