XSD条件分组

时间:2012-12-28 10:50:03

标签: xsd

我不完全确定我是否正在使用正确的进程,或者即使可能,但是我想要做的是创建一个定义以下模式的XSL文件:

<data>
    <s>
        <name>Joe Blogs</name>
        <id>1235</id>
        <aa>data</aa>
        <ab>data</ab>
        <ad>data</ad>
        <ae>data</ae>
    </s>
    <s>
        <name>Jane Blogs</name>
        <id>1234</id>
        <ba>data</ba>
        <bb>data</bb>
    </s>
    <s>
        <name>Jane Blogs</name>
        <id>1234</id>
        <aa>data</aa>
        <ac>data</ac>
        <ad>data</ad>
        <ae>data</ae>
    <s>
</data>

基本上是这样的:

  • <data>标记是根。它可以是空的。
  • <s>标记可以多次出现。
    • <ba>代码必须附带标记<bb>
    • <aa>代码必须附带代码<ad><ae>
      • 标记<ab>必须仅在<aa>(及相关标记)出现时显示,但不得出现在<ac>和vica-verca的位置。

我试图用一个元素来实现它:

<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="s" 
                    maxOccurs="unbounded" 
                    minOccurs="0">
          <xs:complexType>
            <xs:choice>
              <xs:sequence>
                <xs:element name="name"/>
                <xs:element name="id"/>
                <xs:element name="aa"/>
                <xs:element name="ab"/>
                <xs:element name="ad"/>
                <xs:element name="ae"/>
              </xs:sequence>
              <xs:sequence>
                <xs:element name="name"/>
                <xs:element name="id"/>
                <xs:element name="aa"/>
                <xs:element name="ac"/>
                <xs:element name="ad"/>
                <xs:element name="ae"/>
              </xs:sequence>
              <xs:sequence>
                <xs:element name="name"/>
                <xs:element name="id"/>
                <xs:element name="ba"/>
                <xs:element name="bb"/>
              </xs:sequence>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你很亲密。问题是,鉴于您当前的声明,XSD验证器不知道,当它看到一个初始name元素时,您指定它应该选择的三个序列中的哪一个。不允许在输入中向前看以做出选择;它必须能够在没有前瞻的情况下导航内容模型。

通过这种方式重新构建复杂类型可以消除这个问题。

<xs:complexType>
  <xs:sequence>
    <xs:element name="name"/>
    <xs:element name="id"/>
    <xs:choice>
      <xs:sequence>
        <xs:element name="ba"/>
        <xs:element name="bb"/>
      </xs:sequence>
      <xs:sequence>
        <xs:element name="aa"/>
        <xs:choice>
          <xs:element name="ab"/>
          <xs:element name="ac"/>                  
        </xs:choice>
        <xs:element name="ad"/>
        <xs:element name="ae"/>
      </xs:sequence>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

正如您所看到的,我所做的就是将您选择的公共前缀分解出来并将它们放在选择点之前。