XML验证错误S4s-elt-invalid-content.1:key元素异常求助
解决XSD中
<key>/<keyref>导致的S4s-elt-invalid-content.1错误 你遇到的这个错误本质是XSD约束的放置位置不符合规范,再加上几处元素名、路径和类型定义的细节错误,导致验证失败。下面一步步帮你修复:
核心错误:<xs:key>和<xs:keyref>的位置不正确
在XML Schema中,<xs:key>和<xs:keyref>是元素级别的约束,必须嵌套在它们所作用的父元素的定义内部(通常是根元素,因为你的约束跨多个子元素),不能直接放在<xs:schema>根节点下。
你的原XSD里只简单声明了根元素<xs:element name="hwmarketing" />,没有定义其内部结构,也没有把key约束放在正确的位置。
其他需要修正的细节问题
- 元素名大小写不匹配:XML中的
<magadvert>和XSD里的<xs:element name="magAdvert">大小写不一致,会导致验证不通过 - Keyref的路径错误:你的
adRefkeyref指向的路径和属性名不正确,应该关联campaign下的advertisments元素的adRef属性 - 货币类型定义错误:
<xs:totalDigits value="2"/>应该改为<xs:fractionDigits value="2"/>,用来限制小数位数 - 根元素
hwmarketing的结构未定义:需要补充其内部子元素的序列定义 advertSize类型不匹配:XML中是浮点数值671.69,原XSD用xs:positiveInteger会导致验证失败
修复后的完整XSD代码
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- Position Datatype --> <xs:simpleType name="position"> <xs:restriction base="xs:string"> <xs:enumeration value="Inside front"/> <xs:enumeration value="Inside back"/> <xs:enumeration value="Other"/> </xs:restriction> </xs:simpleType> <!-- Custom datatype for Date formatting --> <xs:simpleType name="dateFormat"> <xs:restriction base="xs:string"> <xs:pattern value="\d{2}[/]\d{2}[/]\d{4}"/> <xs:length value="10"/> </xs:restriction> </xs:simpleType> <!-- Currency datatype --> <xs:simpleType name="currency"> <xs:restriction base="xs:decimal"> <xs:minInclusive value="100"/> <xs:maxInclusive value="999999"/> <xs:fractionDigits value="2"/> <!-- 修正:限制小数位数为2 --> </xs:restriction> </xs:simpleType> <!-- Campaign element --> <xs:element name="campaign" > <xs:complexType> <xs:sequence> <xs:element name="releaseDate" type="dateFormat"/> <xs:element name="endDate" type="dateFormat"/> <xs:element name="advertisments" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="adRef" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="campID" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> <!-- Magazine element --> <xs:element name="magadvert" > <!-- 修正:和XML中的元素名保持一致(小写t) --> <xs:complexType> <xs:sequence> <xs:element name="releaseDate" type="dateFormat"/> <xs:element name="endDate" type="dateFormat"/> <xs:element name="magName" type="xs:string"/> <xs:element name="advertSize" type="xs:decimal"/> <!-- 修正:匹配XML中的浮点数值 --> <xs:element name="position" type="position"/> <xs:element name="issuesAppeared" type="xs:positiveInteger"/> <xs:element name="magCost" type="currency"/> </xs:sequence> <xs:attribute name="advertID" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> <!-- Employee element --> <xs:element name="employee" > <xs:complexType> <xs:sequence> <xs:element name="fName" type="xs:string"/> <xs:element name="lName" type="xs:string"/> <xs:element name="DOB" type="dateFormat"/> <xs:element name="workedOn" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="campaign" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="empID" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> <!-- noOfHours element --> <xs:element name="employeeHours"> <xs:complexType> <xs:sequence> <xs:element name="hours" type="xs:positiveInteger" /> <xs:element name="campaignEmployee"> <xs:complexType> <xs:attribute name="campID" type="xs:positiveInteger" use="required"/> <xs:attribute name="empID" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- Root element with key/keyref constraints --> <xs:element name="hwmarketing"> <xs:complexType> <xs:sequence> <xs:element name="campaigns"> <xs:complexType> <xs:sequence> <xs:element ref="campaign" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="adverts"> <xs:complexType> <xs:sequence> <xs:element ref="magadvert" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="employees"> <xs:complexType> <xs:sequence> <xs:element ref="employee" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="noOfHours"> <xs:complexType> <xs:sequence> <xs:element ref="employeeHours" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <!-- 把key和keyref放在根元素的定义内部 --> <xs:key name="adKey"> <xs:selector xpath="adverts/magadvert"/> <!-- 修正:路径从根元素的子元素开始 --> <xs:field xpath="@advertID"/> </xs:key> <xs:keyref name="adRef" ref="adKey"> <xs:selector xpath="campaigns/campaign/advertisments"/> <!-- 修正:指向包含adRef属性的元素 --> <xs:field xpath="@adRef"/> <!-- 修正:对应XML中的adRef属性 --> </xs:keyref> </xs:element> </xs:schema>
关键修复点说明
- 约束位置修正:将
<xs:key>和<xs:keyref>嵌套在根元素hwmarketing的定义内部,这样Schema就能识别这些约束是作用于整个文档结构的。 - 元素名匹配:把XSD中的
magAdvert改为magadvert,和XML中的元素名完全一致。 - 路径修正:
adKey的selector路径改为adverts/magadvert(相对于根元素hwmarketing)adRef的selector路径改为campaigns/campaign/advertisments,field改为@adRef,对应XML中advertisments元素的adRef属性
- 类型修正:
- 货币类型把
totalDigits改为fractionDigits,确保小数位数正确 advertSize类型改为xs:decimal,匹配XML中的浮点数值
- 货币类型把
- 补充元素结构:完整定义了
hwmarketing及其子元素(campaigns、adverts等)的结构,同时给advertisments、workedOn、campaignEmployee这些带属性的元素补充了complexType定义。
用这个修复后的XSD验证你的XML文件,就能正常通过了。
内容的提问来源于stack exchange,提问作者Naeem Khan
相关产品推荐
相关产品推荐

