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

如何在XML Schema中声明带属性且文本非空的非复杂内容元素?

如何在XML Schema中声明符合要求的元素

首先看符合要求的XML实例(修正了原示例的闭合标签错误):

<my-element x="aaa" y="bbb">This text node must not be empty!</my-element>

要同时满足非复杂文本内容、带属性、文本非空这三个要求,分两种场景实现:

方案一:兼容XML Schema 1.1及以上版本

直接用xs:assert约束文本长度,写法更简洁:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="my-element">
    <xs:complexType>
      <!-- 用simpleContent指定元素内容为简单文本,而非子元素 -->
      <xs:simpleContent>
        <!-- 基于字符串类型扩展,添加属性 -->
        <xs:extension base="xs:string">
          <xs:attribute name="x" type="xs:string" use="required"/>
          <xs:attribute name="y" type="xs:string" use="required"/>
        </xs:extension>
      </xs:simpleContent>
      <!-- 断言文本节点长度大于0,确保非空 -->
      <xs:assert test="string-length(.) > 0"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

方案二:兼容XML Schema 1.0版本

由于1.0不支持xs:assert,需要先定义一个非空的字符串简单类型,再扩展它:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <!-- 自定义非空字符串类型,限制长度至少为1 -->
  <xs:simpleType name="nonEmptyString">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="my-element">
    <xs:complexType>
      <xs:simpleContent>
        <!-- 扩展自定义的非空字符串类型,添加属性 -->
        <xs:extension base="nonEmptyString">
          <xs:attribute name="x" type="xs:string" use="required"/>
          <xs:attribute name="y" type="xs:string" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

关键说明

  • xs:simpleContent是核心:它让带属性的复合类型元素拥有简单文本内容,而非子元素。
  • 属性的use="required"表示属性必须存在,若允许属性可选,改成use="optional"即可。
  • 两种方案都能严格满足要求,根据你使用的Schema版本选择对应写法就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:43:35