1

我不完全确定我是否使用了正确的过程,或者即使它是可能的,但是我想要做的是创建一个定义以下模式的 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>(和相关标签)存在时出现,但不得出现在 where<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>

任何帮助将不胜感激。

4

1 回答 1

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>

如您所见,我所做的只是将您的选择中的公共前缀分解出来,并将它们放在选择点之前。

于 2012-12-29T02:17:02.517 回答