Xsd 条件分组

Xsd 条件分组,xsd,Xsd,我不完全确定我是否使用了正确的流程,甚至不确定是否可能,但是我想做的是创建一个XSL文件,该文件定义了以下模式: <data> <s> <name>Joe Blogs</name> <id>1235</id> <aa>data</aa> <ab>data</ab> <ad>dat

我不完全确定我是否使用了正确的流程,甚至不确定是否可能,但是我想做的是创建一个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>

乔的博客
1235
数据
数据
数据
数据
简博客
1234
数据
数据
简博客
1234
数据
数据
数据
数据
所以基本上:

  • 标记是根。它可以是空的
  • 标记可以出现多次。
    • 标签必须与标签
      一起使用
    • 标签必须随附标签
      • 标签
        必须仅在出现
        (和相关标签)时出现,但不得出现在
        和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>


任何帮助都将不胜感激。

很接近了。问题是,给定您当前的声明,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>


正如你所看到的,我所做的就是在你的选择中找出共同的前缀,并把它们放在选择点之前

你很接近了。问题是,给定您当前的声明,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>


正如你所看到的,我所做的就是在你的选择中找出共同的前缀,并把它们放在选择点之前

非常感谢,你是一个救生员。非常感谢,你是一个救生员。