1

我有一个 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>or<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>这么虐待???)。我发现了这个很棒的相关解决方案,但它只有在选择是在单个元素之间而不是在它们的组之间时才有效。

有人知道解决方法吗?非常感谢!

4

1 回答 1

0

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

于 2011-08-20T02:28:11.433 回答