关于 xsd:XML Schema 来限制一个字段基于另一个

XML Schema to restrict one field based on another

我有以下架构,我使用它来确保一个人的 PhoneNumberPhoneNumberType(家庭、工作等)不超过 10 个字符。但是,我想改进此架构,以便如果未提供 PhoneNumber,则不需要 PhoneNumberType,但如果提供了 PhoneNumber,则需要。有没有办法在 XML Schema 1.0 中做到这一点?

我知道这可以在 XML Schema 1.1 中使用 <xs:assert/> 完成,但不幸的是我被 XML Schema 1.0 卡住了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xs:element name="PhoneNumber">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:minLength value="0"/>
        <xs:maxLength value="10"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="PhoneNumberType">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:minLength value="0"/>
        <xs:maxLength value="10"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xsd:schema>

抱歉,XML Schema 不能这样做。

一些类似的问题:

  • 两个xml列表的长度可以定义为要求相等吗?
  • 基于属性限制元素值
  • 如何使用属性值作为 XML 多态类型选择的判别器?
  • 如何在 XSD 中根据它的邻居 xml 节点值验证 xml 节点值

可能为时已晚,但您可以像这样将它们分组

1
2
3
4
5
<xs:group name="group">
<xs:sequence>
    <xs:element ref="PhoneNumber"/>
    <xs:element ref="PhoneNymberType" />
</xs:sequence>

是否需要这个组


在我看来,这是一种"有"关系。

如果你有一个PhoneNumber 元素,那么它应该有一个PhoneNumberType 类型的属性。我建议您将 PhoneNumber 转换为复杂元素并将 PhoneNumberType 设置为它的必需属性,而不是搞乱验证和限制。