xs:key配置报错求助:XML Schema中numSerie标识符设置问题
解决XSD中xs:key放置位置导致的报错问题
问题详情
我是编程新手,在编写XML Schema时,想把numSerie属性设为唯一标识符,使用xs:key时触发报错:
s4s-elt-invalid-content.1: The content of 'schema' is invalid. Element 'key' is invalid, misplaced, or occurs too often.xsd(s4s-elt-invalid-content.1)
尝试过把xs:key移到<xs:attribute name="numSerie" type="tipoNumSerie"/>下方,但问题依旧。当前的XSD代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="tipoNumSerie"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:key name="idNumSerie"> <xs:selector xpath="impresora"/> <xs:field xpath="@numSerie"/> </xs:key> <xs:complexType name="tipoImpresora"> <xs:sequence> <!--List of simple elements--> </xs:sequence> <xs:attribute name="numSerie" type="tipoNumSerie"/> </xs:complexType> <xs:complexType name="tipoImpresoras"> <xs:sequence> <xs:element name="impresora" type="tipoImpresora" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:element name="impresoras" type="tipoImpresoras"/> </xs:schema>
问题原因
xs:key不能直接作为<xs:schema>的直接子节点,它必须定义在包含目标元素的全局元素内部——也就是你的<xs:element name="impresoras">里面。因为唯一性约束是针对特定上下文元素下的子元素/属性生效的,必须绑定到对应的上下文节点上。
修正方案
把xs:key移动到<xs:element name="impresoras" type="tipoImpresoras"/>的内部,作为它的子节点即可。修正后的完整代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="tipoNumSerie"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:complexType name="tipoImpresora"> <xs:sequence> <!--List of simple elements--> </xs:sequence> <xs:attribute name="numSerie" type="tipoNumSerie"/> </xs:complexType> <xs:complexType name="tipoImpresoras"> <xs:sequence> <xs:element name="impresora" type="tipoImpresora" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:element name="impresoras" type="tipoImpresoras"> <!-- 将xs:key绑定到impresoras元素上下文 --> <xs:key name="idNumSerie"> <xs:selector xpath="impresora"/> <xs:field xpath="@numSerie"/> </xs:key> </xs:element> </xs:schema>
这样就能正确约束impresoras下所有impresora元素的numSerie属性唯一了。
内容的提问来源于stack exchange,提问作者alexearp
相关产品推荐
相关产品推荐

