根据元素值

时间:2017-11-05 14:29:29

标签: xml excel xsd xsd-validation restrictions

我一直在网上搜索一段时间,从我可以告诉我想要的东西是不可能使用XSD 1.0。我的要求是:

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

enter image description here

要求只有一个,鸟1,2,3下的值受限于每个Min&的范围。每个功能的最大值。

例如,Bird 1的重量必须介于10-20之间,而Bird 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或其他类似的方案,那将是可行的。但是因为我需要将xsd导入Excel,所以我不得不使用XSD 1.0。

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

使这项工作的任何建议或解决方法???

提前谢谢

1 个答案:

答案 0 :(得分:1)

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

我对数据模型有评论。简而言之,我建议在逻辑层面上交换行和列。如果我正确地假设新鸟将比新功能更频繁地添加,那么应该针对此优化模式,这恰好可以解决问题。

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

然后鸟类可以成为一等公民并成为&#34; XML行&#34;虽然他们的功能可以成为他们的属性(但没有什么阻止将它们显示为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>