为什么'ref'在这种情况下不起作用:
<xs:complexType name="Team">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Size">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element ref="Size"/>
</xs:sequence>
</xs:complexType>
元素Size有本地范围,不能在本地重用吗?
编辑:上面的情况可能没有多大意义。考虑下面的案例,是否有办法重用现有的“大小”定义:
<xs:complexType name="Team">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Size">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="teamLeads">
<xs:complexType>
<xs:sequence>
<xs:element ref="Size"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
答案 0 :(得分:3)
您只能参考顶级元素。
{term}(顶级)元素声明·由
ref
[attribute]的实际值解析。
http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#declare-element(参见方框最后一部分)
答案 1 :(得分:1)
Why Does not 'ref' work in this case
因为您尝试两次定义相同的元素。即使你不使用ref但是名字也会出错!
就像这样两次声明元素一样好:
示例:
<xs:complexType name="Team">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Size">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="1" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Size">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="1" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
ComplexType不能多次定义具有相同或不同类型的同名元素。
Warning : Elements with the same name and in the same scope must have the same type.
这可能是你得到错误的原因..消息可能不清楚,但原因是一样的。
编辑:在这种情况下,我们使用maxOccurs来完成工作!
如果你想使用ref,那么相应的元素应该在不同的XSD(通过命名空间导入)或至少是当前的ComplexType
使用相同的名称,不同层次结构中可以有多个元素!不同类型 !! XSD允许这个!它必须允许!
当你使用带有这个名字的ref时,它应该考虑哪个元素?它将成为一个模棱两可的定义!不是吗?
这就是原因,XSD不允许非全局元素作为参考。虽然您当前的代码没有多个具有相同名称的元素,但它可以拥有< / strong> ..
这是不同层次的不同类型的多个元素的示例:
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Size">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="1" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="something">
<xs:complexType>
<xs:sequence>
<xs:element name="Size" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!--<xs:element ref="Size" />-->
</xs:sequence>
</xs:complexType>