【问题标题】:XSD element substitution group enforce constraintXSD 元素替换组强制约束
【发布时间】:2020-01-07 13:50:51
【问题描述】:

我有以下 XSD

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

      <xs:element name="Sea">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="FishSubGroup"
                        minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
          <xs:attribute name="name" type="xs:string" use="optional"/>
        </xs:complexType>
      </xs:element>

      <xs:element name="FishSubGroup" abstract="true"/>

      <xs:element name="Tuna" type="FishType" substitutionGroup="FishSubGroup"/>
      <xs:element name="Carp" type="FishType" substitutionGroup="FishSubGroup"/>
      <xs:element name="Salmon" type="FishType" substitutionGroup="FishSubGroup"/>

      <xs:complexType name="FishType">
        <xs:attribute name="name" type="xs:string"/>
      </xs:complexType>
    </xs:schema>

这个XML代表一个有效的实例:

<?xml version="1.0" encoding="UTF-8"?>
<Sea name="Atlantic Ocean">
  <Tuna name="tuna1"/>
  <Carp name="carp1"/>
  <Carp name="carp2"/>
  <Tuna name="tuna2"/>
  <Salmon name="salmon1"/>
</Sea>

注意:我从post 中获取了一个很好的水生示例。

问题:

XSD 中有没有一种方法可以定义一个约束,使其类别中只有一个替换元素?换句话说,我希望最多有 1 条金枪鱼、1 条鲤鱼、1 条鲑鱼等,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Sea name="Atlantic Ocean">
  <Tuna name="tuna1"/>
  <Carp name="carp1"/>
  <Carp name="carp2"/> <!-- <-- Invalid Carp Already Defined -->
  <Tuna name="tuna2"/> <!-- <-- Invalid Tuna Already Defined -->
  <Salmon name="salmon1"/>
</Sea>

【问题讨论】:

    标签: xml xsd xsd-validation


    【解决方案1】:

    您可以在 XSD 1.0 中执行此操作,方法是确保 Carp 元素具有具有固定值 type="Carp" 的属性,对于其他元素也是如此,然后定义一个需要隐式 type 属性的 xs:unique 约束在Sea 中是唯一的。

    在 XSD 1.1 中,使用 test="count(*) = count(distinct-values(*/local-name()))"Sea 元素上定义一个断言。 (英文中,元素个数必须与不同元素名称的个数相同。)

    【讨论】:

    • 使用了神秘的 test="count(*) = count(distinct-values(*/local-name())) ;-)
    • 刚刚发现我在编程方面使用的工具拒绝处理 xsd v 1.1。您能否详细说明如何定义具有“隐式”类型属性的 xs:unique 约束在海中是唯一的?谢谢
    • 像大多数人一样,我发现使用旧技术来解决使用最新版本更容易解决的问题的冗长变通办法并不是很有趣。我知道我们有时在日常工作中都必须这样做,但我不必在 StackOverflow 上这样做。
    • 同意。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多