考虑以下架构:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Root">
<xs:sequence>
<xs:element ref="Child" />
<xs:element name="Child2" type="Child" />
</xs:sequence>
<xs:attribute ref="Att" />
<xs:attribute name="Att2" type="Att" />
</xs:complexType>
<xs:complexType name="Child">
<xs:attribute ref="Att" />
</xs:complexType>
<xs:attribute name="Att" type="xs:integer" />
</xs:schema>
第6行的ref
到“Child”失败,而第7行的type
验证。对于该属性,ref
在type
失败时成功。我想了解原因。
我对ref
的理解是,它只是引用了另一个元素,并指定您希望在该位置看到引用类型的实例(在定义中给出名称)。显然我错了,那么ref
究竟是什么意思呢?
答案 0 :(得分:20)
使用ref =“..”您正在“粘贴”在其他位置定义的现有元素/属性。使用type =“..”,您将一些结构(在complextype / simpletype中定义)分配给新元素/属性。请看以下内容:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tst="test" targetNamespace="test">
<xs:complexType name="Root">
<xs:sequence>
<xs:element ref="tst:Child" />
<xs:element name="Child2" type="tst:ChildType" />
</xs:sequence>
<xs:attribute ref="tst:AttRef" />
<xs:attribute name="Att2" type="tst:AttType" />
</xs:complexType>
<xs:complexType name="ChildType">
<xs:attribute ref="tst:AttRef" />
</xs:complexType>
<xs:element name="Child">
</xs:element>
<xs:simpleType name="AttType">
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
<xs:attribute name="AttRef" type="xs:integer" />
</xs:schema>
答案 1 :(得分:3)
在内容模型中,xs:element
元素可以是:
(同名/ ref替换适用于属性声明和属性引用,并且内联类型定义和对命名类型的引用之间存在类似的二分法。)
在您的示例中,没有名为Child的元素的顶级声明,因此ref
属性失败。我希望这会有所帮助。
答案 2 :(得分:1)
ref和type之间的显着区别在于,对于类型,你不能进一步降低级别,但使用ref,你可以使用一个可以有额外级别的元素,等等。