无序的元素列表,包括1个元素和其他3个元素序列之间的选择

时间:2011-07-26 08:52:04

标签: xml xsd choice

我有一个XML可以是这样的:

<profile>
  <docname>Bla bla bla</docname>
  <author>Bubi</author>
  <doctype>INVOICE</doctype>
</profile>

或者像这样:

<profile>
  <author>Bubi</author>
  <docname>Bla bla bla</docname>
  <type1>3</type1>
  <type2>1</type2>
  <type3>0</type3>
</profile>

元素可以按任何顺序出现。如您所见,必须提供<doctype><type1><type2><type3>标记。

我需要一个XSD。我试过

<xs:element name="profile">
  <xs:complexType>
    <xs:all>
      <xs:element type="xs:string" name="author"/>
      <xs:element type="xs:string" name="docname"/>
      <xs:choice>
        <xs:element type="xs:string" name="doctype"/>
        <xs:sequence> <!--another little problem: I'd like to put a <xs:all> but is not allowed...-->
          <xs:element type="xs:byte" name="type1"/>
          <xs:element type="xs:byte" name="type2"/>
          <xs:element type="xs:byte" name="type3"/>
        </xs:sequence>
      </xs:choice>
    </xs:all>
  </xs:complexType>
</xs:element>

<xs:choice>内不允许使用<xs:all>为什么<xs:all>如此虐待??? )。我发现this great related solution,但只有当选择是在单个元素之间而不是在它们的组中时才有效。

任何人都知道解决方法吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

这里的主要问题与独特的粒子归属有关。如果您有选项,Relax NG模式可能会帮助您。否则,您必须使用其他机制(简单的XSLT或手写代码等)补充“弱”XSD(使用所有六个元素执行xsd:all)。