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

使用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>

关键修正说明

  1. 带属性的文本元素定义:用<xs:complexType>配合<xs:simpleContent>扩展xs:string类型,这样既保留了文本内容的特性,又允许添加属性。
  2. 属性语法修正:移除了tipo属性的type="xs:string"声明,直接在属性内部定义枚举限制,符合XSD语法规范。
  3. 可选优化:给tipo属性加上了use="required",确保XML中的<medio>必须携带该属性,如果你不需要强制要求,可以去掉这个属性。
  4. 范围修正:调换了dia和mes的最大取值范围,符合实际日期逻辑。

现在用这个XSD验证你的XML文档,<medio tipo="radio">Onda Cero</medio>就能正常通过验证啦!

内容的提问来源于stack exchange,提问作者Maria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:50:00