我在XML Schema中定义密钥时遇到问题。
CODE:
XSD:
<xsd:element name="players">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="player" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:all>
<xsd:element name="date-of-birth" type="xsd:date"></xsd:element>
<xsd:element name="gender">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="MALE" />
<xsd:enumeration value="FEMALE" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:all>
<xsd:attribute name="username" type="xsd:string" use="required" />
</xsd:complexType>
<xsd:key name="playerkey">
<xsd:selector xpath="players/player" />
<xsd:field xpath="username" />
</xsd:key>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
请注意,这只是完整代码的一个例子,但它显示了所有必要的信息。
XML
<t:players>
<t:player username="Super Mario">
<t:gender>FEMALE</t:gender>
<t:date-of-birth>1995-11-29</t:date-of-birth>
</t:player>
<t:player username="Super Mario">
<t:date-of-birth>1991-10-12</t:date-of-birth>
<t:gender>MALE</t:gender>
</t:player>
</t:players>
问题:
正如你所看到的,我创造了两个名为“超级马里奥”的玩家。由于密钥应该是唯一的,因此应该抛出错误,但xmllins确实正确验证了文件
问题:
如何正确定义密钥,元素必须是唯一的。
答案 0 :(得分:2)
@
前缀。<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="xyzzy" xmlns:t="xyzzy"> <xsd:element name="players"> <xsd:complexType> ... </xsd:complexType> <xsd:key name="playerkey"> <xsd:selector xpath="t:player" /> <xsd:field xpath="@username" /> </xsd:key> </xsd:element> </xsd:schema>
更新了命名空间限定。
答案 1 :(得分:1)
在XSD中,如果您希望某个元素R中的每个元素E都具有F的唯一值,则R的声明需要包含一个键定义,其中选择器从R中选择E,并且该字段从中选择F即