XSD如何将maxOccurs设置为前一个元素计数的值

时间:2011-09-07 10:34:16

标签: xsd

我需要为xml创建一个xsd,其中有许多名称列和行的元素。

请建议XSD,我已经将cols作为无界限,我应该如何制作元素行。

<cols>
    <id>a</id>
    <type>string</type>
</cols>
<cols>
    <id>b</id>
    <type>string</type>
</cols>
<cols>
    <id>c</id>
    <type>number</type>
</cols>
<rows>
    <c>
        <v>a</v>
    </c>
    <c>
        <v>b</v>
    </c>
    <c>
        <v>3</v>
    </c>
</rows>
<rows>
    <c>
        <v>c</v>

1 个答案:

答案 0 :(得分:0)

您发布的xml示例对任何架构都无效。事实上,xml永远不应该有多个根节点(如你的例子所示)。您需要将它们包装在单个根节点中。

在回答您的问题时,xsd不支持以您假设的节点集中节点数计数为条件的属性值。你能做的最好就是使用无限制的maxOccurs。

您想要的架构看起来与此类似:

<xs:schema xmlns="http://mynamespace" targetNamespace="http://mynamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="cols">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="id" type="xs:string" />
              <xs:element name="type" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element maxOccurs="unbounded" name="rows">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="c">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="v" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

希望这有助于你