如何声明特殊XML模式(XSD)案例

时间:2009-01-04 07:45:20

标签: xml xsd

我需要你的帮助来在XML模式中定义一个特例: 包含两个元素的序列:'x'和'y'而不是:

  • <x>元素在序列中出现0到未绑定时间

  • <y>元素在序列中可以出现0到1次

  • <x><y>位置可以是任意位置 - 也就是说,可以将未绑定时间设为<x>元素,然后是单个<y>元素,然后取消绑定<x>元素。

此问题的XML示例:

示例#1

<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

示例#2

<y>stuff</y>
<x>stuff</x>
<x>stuff</x>

示例#3

<x>stuff</x> 
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

谢谢!

4 个答案:

答案 0 :(得分:5)

出于各种原因,Yuval,Mo或者davidsheldon的样本都没有工作。这是一个 确实

    <xs:complexType name="myComplexType">
    <xs:sequence>
        <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        <xs:sequence minOccurs="0">
            <xs:element name="y" type="xs:string"/>
            <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:sequence>
    </xs:complexType>

答案 1 :(得分:2)

编辑:正如Alohci所说,我的解决方案是错误的。根据规范,xs:all中的元素只能出现零次或一次。抱歉给您带来不便

我认为你想要的不是一个序列。序列不仅定义了元素,还定义了顺序。在您的情况下,订单可能会改变。你试过xs:all吗?

<xs:complexType name="myComplexType">
  <xs:all>
    <xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
    <xs:element name="y" type="xs:string" maxOccurs="1"/>
  </xs:all>
</xs:complexType>

另一个appraoch可能是使序列成为序列,但将序列标记为maxOccurs="unbounded"

答案 2 :(得分:0)

不太复杂。在我的头顶,它应该是这样的:

<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 

由于XSD中的每个元素在默认情况下都是可选的,因此该XSD将与您定义的XML结构匹配,y元素出现在x元素之前,之后或之间的任何位置,最大值出现1

答案 3 :(得分:0)

我使用架构已经有一段时间了,但我认为序列是你的答案。

你需要在(x)或(a y后跟x)之间有无限数量的选择。

<xsd:element name="parent">
  <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="x" type="xs:string"/>
      <xsd:sequence>
        <xsd:element name="y" type="xsd:string" />
        <xsd:element name="x" type="xsd:string" />
      </xsd:sequence>
    </xsd:choice>
  </xsd:complexType>  
</xsd:element>