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

构建XSD验证<r>元素必须仅包含itm或fct其中一个

问题:验证<r>元素必须恰好包含itm或fct子元素中的一个

我正在构建一份XSD,需要验证<trs>下的<r>元素必须恰好包含itm或fct这两个子元素中的一个,目前尚未找到正确的实现方法。

XML示例

<trs>
    <r NUM="1">
        <itm F01="123"/>
        <F65>1.00</F65>
    </r>
    <r NUM="2">
        <fct F02="345"/>
        <F65>2.00</F65>
    </r>
</trs>

我尝试编写的XSD

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="trs">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="r" maxOccurs="unbounded" minOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="itm" minOccurs="0">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute type="xs:short" name="F01"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="fct" minOccurs="0">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute type="xs:short" name="F02"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element type="xs:float" name="F65"/>
            </xs:sequence>
            <xs:attribute type="xs:byte" name="NUM"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

解决方案

要实现“必须恰好包含itm或fct中的一个”的验证,需要使用xs:choice元素替代原来的xs:sequence中直接并列的itm和fct,同时设置xs:choice的minOccurs="1"和maxOccurs="1",确保每个<r>元素必须且只能选择其中一个子元素。

修改后的XSD如下:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="trs">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="r" maxOccurs="unbounded" minOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <!-- 使用choice确保二选一 -->
              <xs:choice minOccurs="1" maxOccurs="1">
                <xs:element name="itm">
                  <xs:complexType>
                    <xs:simpleContent>
                      <xs:extension base="xs:string">
                        <xs:attribute type="xs:short" name="F01"/>
                      </xs:extension>
                    </xs:simpleContent>
                  </xs:complexType>
                </xs:element>
                <xs:element name="fct">
                  <xs:complexType>
                    <xs:simpleContent>
                      <xs:extension base="xs:string">
                        <xs:attribute type="xs:short" name="F02"/>
                      </xs:extension>
                    </xs:simpleContent>
                  </xs:complexType>
                </xs:element>
              </xs:choice>
              <xs:element type="xs:float" name="F65"/>
            </xs:sequence>
            <xs:attribute type="xs:byte" name="NUM"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

修改说明

  • 将原来的itm和fct元素包裹在xs:choice中,并设置minOccurs="1"和maxOccurs="1",强制要求必须选择且只能选择其中一个。
  • 移除了itm和fct自身的minOccurs="0",因为choice已经控制了出现次数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:45:45