创build一个可以导入到EXCEL的XSD,并使用基于元素值的限制

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

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

在这里输入图像说明

这个要求只有一个,那就是Bird 1,2,3下面的值是受限于每个特征的Min和Max的范围。

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

在鸟类3下,重量和高度不是有效的方法,因为它们在最小 – 最大范围之外。

现在我需要创build一个可导入到Excel的XSD文件,并创build了上述工作的限制条件。

我所做的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或其他像schetron这样可行的东西。 但是因为我需要将xsd导入到Excel中,我不得不使用XSD 1.0。

我目前正在试图找出一种方法来做到这一点,基于示例的示例 Key和Key-ref,但到目前为止我没有运气。

任何build议或解决方法,使这项工作?

先谢谢你

事实上,使用XML Schema 1.1,您可以使用XPath定义更多限制。

我对数据模型有一个评论。 总之,我会build议在逻辑层上交换行和列。 如果我正确地认为新鸟会比新特征更频繁地添加,则应该为此优化模式,这恰好避开了这个问题。

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

然后鸟就可以成为一stream的公民,成为“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>