<xs:openContent>报错‘invalid, misplaced, or occurs too often’原因排查
解决XSD中xs:openContent的"s4s-elt-invalid-content.1"错误
这个报错主要有两个核心原因,对应解决方法如下:
1. XSD 1.1支持未启用
<xs:openContent>是XSD 1.1的专属特性,很多默认的XML验证工具(包括VSCode的XML插件)默认只支持XSD 1.0。哪怕你在schema里声明了version="1.1",如果处理器没开启1.1支持,还是会判定这个元素非法。
解决步骤:
- 确保schema开头正确声明1.1版本:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1">
- 在VSCode中开启XSD 1.1支持:
打开设置(Ctrl+,),搜索「XML > Validation > Schema」,勾选「Enable XSD 1.1 Support」;或者直接在工作区的settings.json中添加:
{ "xml.validation.schema.enableXsd11Support": true }
2. xs:openContent的位置不符合XSD 1.1语法规范
XSD 1.1对<xs:openContent>的放置位置有严格要求:它必须是<xs:complexType>的直接子元素,且要放在模型组(比如<xs:sequence>、<xs:choice>)之前,不能嵌套在模型组内部。
错误示例(会报错):
<xs:complexType name="OpenProductType"> <xs:sequence> <xs:openContent mode="interleave"> <!-- 错误:嵌套在sequence里 --> <xs:any namespace="##other" processContents="lax"/> </xs:openContent> <xs:element name="productId" type="xs:string"/> </xs:sequence> </xs:complexType>
正确示例:
<xs:complexType name="OpenProductType"> <xs:openContent mode="interleave"> <xs:any namespace="##other" processContents="lax"/> </xs:openContent> <xs:sequence> <xs:element name="productId" type="xs:string"/> <xs:element name="name" type="xs:string"/> </xs:sequence> </xs:complexType>
按以上两点调整后,验证报错应该就能解决。
内容的提问来源于stack exchange,提问作者Suppenhuhn79
相关产品推荐
相关产品推荐

