You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:35:14