如何编写一个XSD来验证具有不同列数的表?

时间:2014-07-07 19:34:02

标签: xml xsd

我有这个XSD工作正常:

<?xml version="1.0" encoding="utf-16"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="ExportFile">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Part" minOccurs="2" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element type="xsd:normalizedString" name="PrdCode" />
              <xsd:element type="xsd:normalizedString" name="PrdName" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week1" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week2" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week3" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week4" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week5" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week6" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week7" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week8" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week9" />
              <xsd:element type="xsd:nonNegativeInteger" name="Week10" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

如何更改它以验证包含10到80个“周”列的XML 使用顺序名称,例如:“Week1”,“Week2”,......,“WeekN”。 (10 = = N = 80)

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

有时当XSD不允许你做X时,这是因为X不是一件好事。使用结构化标识符(封装有关他们识别的事物的信息的标识符)几乎总是一个坏主意,在选择元素名称时肯定是个坏主意。

最好用<week20>替换<week nr="20">

话虽如此,您仍然需要XSD 1.1来定义周数必须是递增的连续序列的约束。在XSD 1.1中表达此约束的方法是

<xs:assert test="every $i in 1 to count(week) satisfies week[$i]/@nr = $i"/>

但是,@nr属性实际上是多余的:您可以始终根据序列中的位置计算周数。在XML中包含冗余信息有什么意义?如果你把它遗漏了,你就不需要定义约束了。