Xml XSD-如何允许元素以任意顺序任意次数出现?

Xml XSD-如何允许元素以任意顺序任意次数出现?,xml,xsd,Xml,Xsd,我正在尝试创建XSD,并尝试编写具有以下要求的定义: 允许指定的子元素出现任意次数(0到无界) 允许子元素按任意顺序排列 我环顾四周,发现了各种解决方案,如: 但据我所知,xs:choice仍然只允许单元素选择。因此,像这样将MaxOccurs设置为unbounded应该只意味着子元素中的“任意一个”可以出现多次。这准确吗 如果上述解决方案不正确,我如何实现我在要求中所述的目标 编辑:如果要求如下怎么办 元素child1 child2可以出现在任何位置 次数(0到无界) 元素以任何顺序

我正在尝试创建XSD,并尝试编写具有以下要求的定义:

  • 允许指定的子元素出现任意次数(0到无界)
  • 允许子元素按任意顺序排列
我环顾四周,发现了各种解决方案,如:


但据我所知,xs:choice仍然只允许单元素选择。因此,像这样将MaxOccurs设置为unbounded应该只意味着子元素中的“任意一个”可以出现多次。这准确吗

如果上述解决方案不正确,我如何实现我在要求中所述的目标

编辑:如果要求如下怎么办

  • 元素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)


价值
价值
价值
价值
价值

在您的问题中的模式中,
child1
child2
可以以任意顺序、任意次数出现。这听起来像是你要找的

编辑:如果您只希望其中一个元素出现无限次,则必须在元素上显示无限次:

编辑:XML中的固定类型

编辑:最大值中大写的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>

您应该发现以下模式允许您提出的建议

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

这将允许您创建一个文件,例如:

<?xml version="1.0" encoding="utf-8" ?>
<foo>
  <child1>2</child1>
  <child1>3</child1>
  <child2>test</child2>
  <child2>another-test</child2>
</foo>

2.
3.
测试
另一个测试
这似乎符合你的问题

但据我所知,xs:choice仍然只允许单元素选择。因此,像这样将MaxOccurs设置为unbounded应该只意味着子元素中的“任意一个”可以出现多次。这准确吗


否。对于由于
maxOccurs=“unbounded”
而发生的
xs:choice
的每一次“重复”,都会单独进行选择。因此,您发布的代码是正确的,并且实际上会按照编写的代码执行您想要的操作。

这就是最终对我有用的代码:

<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>

在以后的编辑中添加的问题的替代公式似乎仍然没有得到回答:如何指定在元素的子元素中,必须有一个名为
child3
、一个名为
child4
、以及任何名为
child1
child2
的数字,不限制子对象的显示顺序

这是一种可直接定义的正则语言,您需要的内容模型同构于定义字符串集的正则表达式,其中数字“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)*
将其转换为内容模型非常简单。基本结构相当于regex
(34)|(43)

如果我们想将批量最小化一点,我们可以为
child1
child2
的重复选择定义一个命名组:

<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>

但是从前面给出的例子中可以看出,这些对
所有
组的改变实际上并没有改变语言的表达能力;它们只会使某些类型的语言的定义更加简洁。

如果上述任何一种都不起作用,那么您可能正在进行EDI转换,您需要根据HIPPA模式或任何其他复杂的xsd验证您的结果。 要求是,假设有8个参考段,其中任何一个必须以任何顺序出现,也不是所有都是必需的,这意味着您可以按照以下顺序使用它们:第一参考、第三参考、第二参考、第九参考。 在默认情况下,EDI接收将失败,因为默认的复杂类型为

<xs:sequence>
  <xs:element.../>
</xs:sequence>

当你通过引用调用你的元素时,情况甚至是复杂的,而这个元素在它的初始位置本身就相当复杂。 例如:

<xs:element>
<xs:complexType>
<xs:sequence>
<element name="REF1"  ref= "REF1_Mycustomelment" minOccurs="0" maxOccurs="1">
<element name="REF2"  ref= "REF2_Mycustomelment" minOccurs="0" maxOccurs="1">
<element name="REF3"  ref= "REF3_Mycustomelment" minOccurs="0" maxOccurs="1">
</xs:sequence>
</xs:complexType>
</xs:element>

解决方案:

在这里,简单地将“序列”替换为“全部”,或将“选择”替换为最小/最大组合将不起作用

首先将“xs:sequence”替换为“
现在,您需要在引用元素的位置进行一些更改, 有:

<xs:annotation>
  <xs:appinfo>
    <b:recordinfo structure="delimited" field.........Biztalk/2003">


这将使每个元素都是唯一的,原因是所有参考段(上例
<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: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>
<xs:sequence>
  <xs:element.../>
</xs:sequence>
<xs:element>
<xs:complexType>
<xs:sequence>
<element name="REF1"  ref= "REF1_Mycustomelment" minOccurs="0" maxOccurs="1">
<element name="REF2"  ref= "REF2_Mycustomelment" minOccurs="0" maxOccurs="1">
<element name="REF3"  ref= "REF3_Mycustomelment" minOccurs="0" maxOccurs="1">
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:annotation>
  <xs:appinfo>
    <b:recordinfo structure="delimited" field.........Biztalk/2003">