【问题标题】:Create an XSD that can be imported to EXCEL with restrictions based on element values创建一个可以导入到 EXCEL 的 XSD,具有基于元素值的限制
【发布时间】:2018-04-17 18:36:18
【问题描述】:

我已经在网上搜索了一段时间,据我所知,使用 XSD 1.0 无法实现我想要的。我的要求是:

我们有一个 .xml,它在导入到 excel 时会创建下表:

要求只有一个,即Bird 1,2,3下的值限制在每个特征的每个Min和Max的范围内。

例如,鸟 1 的体重必须在 10-20 之间,但鸟 1 的高度必须在 3-9 之间。

在 Bird 3 下,体重和身高不是有效的方法,因为它们超出了它们的最小-最大范围。

现在我需要制作一个可以导入 Excel 的 XSD 文件,并且它会创建使上述工作生效的限制。

我做的XSD是:

    xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Row" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>

              <xs:element type="xs:string" name="Feature"/>           
              <xs:element type="xs:int" name="Min"/>              
              <xs:element type="xs:int" name="Max"/>              
              <xs:element name="Bird 1">
                  <xs:simpleType>
                    <xs:restriction base="xs:int">
                        <xs:minInclusive value="X"/> <!-- X= The Min value -->
                        <xs:maxInclusive value="Y"/> <!-- Y= The Max value -->
                    </xs:restriction>
                  </xs:simpleType>
              </xs:element>           
              <xs:element name="Bird 2">
                  <xs:simpleType>
                    <xs:restriction base="xs:int">
                        <xs:minInclusive value="X"/>  <!-- X= The Min value -->
                        <xs:maxInclusive value="Y"/>  <!-- Y= The Max value -->
                    </xs:restriction>
                  </xs:simpleType>
              </xs:element>           
              <xs:element name="Bird 3">
                  <xs:simpleType>
                    <xs:restriction base="xs:int">
                        <xs:minInclusive value="X"/>  <!-- X= The Min value -->
                        <xs:maxInclusive value="Y"/>  <!-- Y= The Max value -->
                    </xs:restriction>
                  </xs:simpleType>
              </xs:element>

            </xs:sequence>
          </xs:complexType>
        </xs:element>       
      </xs:sequence>      
    </xs:complexType>
  </xs:element>
</xs:schema>

上面的 XSD 仅在限制值中有固定数字时才有效。

理想情况下,我希望限制 minInclusive 和 maxInclusive 值指向 Min Max 元素。

如果我可以使用 XSD 1.1 或其他类似 schematron 的东西,那将是可行的。但是因为我需要将 xsd 导入 Excel,所以我不得不使用 XSD 1.0。

我目前正在尝试根据示例 sample 找出一种使用 Key 和 Key-ref 的方法,但到目前为止我没有运气。

有任何建议或解决方法来完成这项工作???

提前谢谢你

【问题讨论】:

    标签: xml excel xsd xsd-validation restrictions


    【解决方案1】:

    确实,使用 XML Schema 1.1,您可以使用 XPath 定义更多约束。

    不过,我对数据模型有意见。简而言之,我建议在逻辑级别交换行和列。如果我正确地假设新鸟会比新功能更频繁地添加,则应该为此优化架构,这恰好可以规避问题。

    如果预先知道鸟类的特征(年龄、体重、身高)或很少更改,我会将它们视为 XML 模式类型而不是行。这样,最小值和最大值可以存储在 XML Schema 中(如上所述)并将适用于所有鸟类,这应该可以通过 XML Schema 1.0 实现。

    然后鸟类可以成为一等公民并成为“XML 行”,而它们的特征可以成为它们的属性(但没有什么能阻止它们在 Excel 中显示为列,而它们的子元素显示为行):

    <birds>
      <bird id="Bird 1">
        <age>5</age>
        <weight>15</weight>
        <height>4</height>
      </bird>
      <bird id="Bird 2">
        <age>9</age>
        <weight>12</weight>
        <height>7</height>
      </bird>
      <bird id="Bird 3">
        <age>2</age>
        <weight>22</weight>
        <height>2</height>
      </bird>
    </birds>
    

    【讨论】:

    • 亲爱的 Ghislain,感谢您的建议。您的建议是有道理的,这将是一个很好的解决方法,但是我给出的示例只是对我的实际用途的简化。在实际用例中,功能只有百分之几,而且还在不断增长,而“鸟”只是少数。因此,在实际用例中,您的建议是不可能的,尽管事实上这对其他情况非常有用。很抱歉在我的问题中没有明确说明功能编号很大。
    • 感谢您的反馈,斯派罗斯。这是有道理的,而且确实,用例非常重要并且会影响设计。恐怕动态限制范围需要 XML Schema 1.1 的xs:assert
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多