我有一个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,但只有当选择是在单个元素之间而不是在它们的组中时才有效。
任何人都知道解决方法吗?非常感谢!
答案 0 :(得分:0)
这里的主要问题与独特的粒子归属有关。如果您有选项,Relax NG模式可能会帮助您。否则,您必须使用其他机制(简单的XSLT或手写代码等)补充“弱”XSD(使用所有六个元素执行xsd:all)。