如何允许任意次数的元素?

我正在尝试创建一个XSD,并尝试使用以下要求编写定义:

  • 允许指定的子元素出现任意次数(0表示无界)
  • 允许子元素以任何顺序
  • 我环顾四周,发现了像这样的各种解决方案:

      <xs:element name="foo">
      <xsl:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="child1" type="xs:int"/>
          <xs:element name="child2" type="xs:string"/>
        </xs:choice>
      </xs:complexType>
    </xs:element>
    

    但从我的理解xs:选择仍然只允许单个元素选择。 因此,像这样将MaxOccurs设置为无界应该只意味着子元素的“任何一个”可以出现多次。 这是否准确?

    如果上述解决方案不正确,我如何才能达到上述我的要求?

    编辑 :如果要求如下,会怎么样?

  • 元素child1 child2可以出现任意次数(0表示无界)
  • 元素以任何顺序
  • 元素child3和child4应该只出现一次。
  • 例如,这个xml是有效的:

    <foo>
    <child1> value </child1>
    <child1> value </child1>
    <child3> value </child3>
    <child2> value </child2>
    <child4> value </child4>
    <child1> value </child1>
    </foo>
    

    但这不是(失踪的孩子3)

    <foo>
    <child1> value </child1>
    <child1> value </child1>
    <child2> value </child2>
    <child4> value </child4>
    <child1> value </child1>
    </foo>
    

    在您的问题中的架构中, child1child2可以以任意次序出现,任意次数。 所以这听起来像你在找什么。

    编辑:如果你只希望其中的一个出现无限次数,那么无界将不得不继续使用元素:

    编辑:修复XML中的类型。

    编辑:在maxOccurs中大写O.

    <xs:element name="foo">
       <xs:complexType>
         <xs:choice maxOccurs="unbounded">
           <xs:element name="child1" type="xs:int" maxOccurs="unbounded"/>
           <xs:element name="child2" type="xs:string" maxOccurs="unbounded"/>
         </xs:choice>
       </xs:complexType>
    </xs:element>
    

    在以后的编辑添加的问题的另一种措辞似乎仍是悬而未决:如何指定元素的儿童中,必须有一个名为child3 ,一个名为child4 ,任何命名数量child1child2 ,没有约束按照孩子出现的顺序。

    这是一种可直接定义的常规语言,您需要的内容模型与定义一组正则表达式同构,该正则表达式定义数字“3”和“4”各自恰好出现一次的字符串集合,数字“1”和“2” '发生任何次数。 如果不明白怎么写这个,可能会帮助你考虑一下你将用什么样的有限状态机来识别这种语言。 它至少有四个不同的州:

  • 一个初始状态,其中既没有“3”也没有“4”
  • 看到'3'但不是'4'的中间状态
  • 看到'4'但不是'3'的中间状态
  • 一个已经看到'3'和'4'的最终状态
  • 无论自动机处于什么状态,都可以读取“1”和“2”; 他们不会改变机器的状态。 在初始状态下,'3'或'4'也将被接受; 在中间状态下,只有'4'或'3'被接受; 在最后的状态中,'3'和'4'都不被接受。 正则表达式的结构最容易理解,如果我们首先为我们的语言的子集定义一个正则表达式,其中只有'3'和'4'发生:

    (34)|(43)
    

    要允许在给定位置发生任何次数的'1'或'2',我们可以插入(1|2)* (或[12]*如果我们的正则表达式语言接受该符号)。 在所有可用的位置插入这个表达式,我们可以得到

    (1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
    

    将其转换为内容模型非常简单。 基本结构等同于正则表达式(34)|(43)

    <xsd:complexType name="paul0">
      <xsd:choice>
        <xsd:sequence>
          <xsd:element ref="child3"/>
          <xsd:element ref="child4"/>
        </xsd:sequence>
        <xsd:sequence>
          <xsd:element ref="child4"/>
          <xsd:element ref="child3"/>
        </xsd:sequence>
      </xsd:choice>
    </xsd:complexType>
    

    插入child1child2的零个或多个选项很简单:

    <xsd:complexType name="paul1">
      <xsd:sequence>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="child1"/>
          <xsd:element ref="child2"/>
        </xsd:choice>      
        <xsd:choice>
          <xsd:sequence>
            <xsd:element ref="child3"/>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
              <xsd:element ref="child1"/>
              <xsd:element ref="child2"/>
            </xsd:choice>      
            <xsd:element ref="child4"/>
          </xsd:sequence>
          <xsd:sequence>
            <xsd:element ref="child4"/>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
              <xsd:element ref="child1"/>
              <xsd:element ref="child2"/>
            </xsd:choice>      
            <xsd:element ref="child3"/>
          </xsd:sequence>
        </xsd:choice>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="child1"/>
          <xsd:element ref="child2"/>
        </xsd:choice>      
      </xsd:sequence>
    </xsd:complexType>
    

    如果我们希望尽量减少批量,我们可以为child1child2的重复选择定义一个命名组:

    <xsd:group name="onetwo">
      <xsd:choice>
        <xsd:element ref="child1"/>
        <xsd:element ref="child2"/>
      </xsd:choice>   
    </xsd:group>
    
    <xsd:complexType name="paul2">
      <xsd:sequence>
        <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:choice>
          <xsd:sequence>
            <xsd:element ref="child3"/>
            <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element ref="child4"/>
          </xsd:sequence>
          <xsd:sequence>
            <xsd:element ref="child4"/>
            <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element ref="child3"/>
          </xsd:sequence>
        </xsd:choice>  
        <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
    

    在XSD 1.1中, all组的一些限制已被解除,因此可以更简洁地定义此内容模型:

    <xsd:complexType name="paul3">
      <xsd:all>
        <xsd:element ref="child1" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="child2" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="child3"/>
        <xsd:element ref="child4"/>      
      </xsd:all>
    </xsd:complexType>
    

    但从前面的例子可以看出,对all群体的这些变化事实上并没有改变语言的表达能力; 他们只会使某些种类的语言的定义更加简洁。


    这是最终为我工作的:

    <xsd:element name="bar">
      <xsd:complexType>
        <xsd:sequence>
          <!--  Permit any of these tags in any order in any number     -->
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="child1" type="xsd:string" />
            <xsd:element name="child2" type="xsd:string" />
            <xsd:element name="child3" type="xsd:string" />
          </xsd:choice>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    
    链接地址: http://www.djcxy.com/p/34309.html

    上一篇: how to allow elements in any order any number of times?

    下一篇: Customized XSD File