使用XML Schema验证含属性的元素遇阻,寻求解决方案
解决XML Schema中带文本内容+属性的元素验证问题
嘿,我一眼就看到你卡在哪了——问题出在<medio>元素的XSD定义上,咱们拆解一下:
核心错误点
你要定义的<medio>是既有文本内容又有属性的元素,但你直接用type="xs:string"(简单类型)来声明它,这是不行的:简单类型的元素不允许携带属性。另外你在定义tipo属性时的语法也有问题——不能同时给属性指定type又嵌套<xs:simpleType>定义。
修正后的完整XSD
我已经帮你修正了所有问题,包括顺便把你搞反的dia和mes的范围也调过来了:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="Noticias"> <xs:complexType> <xs:sequence> <xs:element name="Noticia" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <!-- 修正medio元素:用simpleContent扩展实现文本+属性 --> <xs:element name="medio"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="tipo" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="radio"/> <xs:enumeration value="prensa"/> <xs:enumeration value="television"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="periodista" type="xs:string"/> <xs:element name="titular" type="xs:string"/> <xs:element name="resumen"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9]{60}"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:attribute name="dia" type="dia"/> <xs:attribute name="mes" type="mes"/> <xs:attribute name="año" type="xs:integer"/> <xs:attribute name="seccion" type="xs:string"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:simpleType name="dia"> <xs:restriction base="xs:integer"> <xs:minInclusive value="1"/> <xs:maxInclusive value="31"/> <!-- 原来的max是12,搞反了 --> </xs:restriction> </xs:simpleType> <xs:simpleType name="mes"> <xs:restriction base="xs:integer"> <xs:minInclusive value="1"/> <xs:maxInclusive value="12"/> <!-- 原来的max是31,搞反了 --> </xs:restriction> </xs:simpleType> </xs:schema>
关键修正说明
- 带属性的文本元素定义:用
<xs:complexType>配合<xs:simpleContent>扩展xs:string类型,这样既保留了文本内容的特性,又允许添加属性。 - 属性语法修正:移除了
tipo属性的type="xs:string"声明,直接在属性内部定义枚举限制,符合XSD语法规范。 - 可选优化:给
tipo属性加上了use="required",确保XML中的<medio>必须携带该属性,如果你不需要强制要求,可以去掉这个属性。 - 范围修正:调换了
dia和mes的最大取值范围,符合实际日期逻辑。
现在用这个XSD验证你的XML文档,<medio tipo="radio">Onda Cero</medio>就能正常通过验证啦!
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

