2012-07-05 67 views
1

单可选元素我有如下形式的XML文件:XSD:按顺序

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 
<hw:config name="test" xmlns:hw="hw"> 
    <switch var="var.test" > 
    <case value="a"> 
    </case> 
    <case value="b"> 
    </case> 
    <default> 
    </default> 
    <case value="c"> 
    </case> 
    </switch> 
</hw:config> 

我想要一个XSD允许,有可能是一个默认的块或没有,但不超过一个。它可能出现在大小写块之间的任何位置。

以下XSD应该做的工作,但xmllint(libxml2的)说, '的内容模型不确定性。':

<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:hw="hw" targetNamespace="hw" > 

    <xsd:simpleType name="defaultType"> 
     <xsd:restriction base="xsd:string"> 
     </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:complexType name="caseType"> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
      <xsd:attribute name="value" type="xsd:string" use="required" /> 
     </xsd:extension> 
     </xsd:simpleContent> 
    </xsd:complexType > 

    <xsd:complexType name="switchType" > 
     <xsd:sequence> 
     <xsd:element name="case" minOccurs="0" maxOccurs="unbounded" type="hw:caseType" /> 
     <xsd:sequence minOccurs="0" maxOccurs="1"> 
      <xsd:element name="default" type="hw:defaultType" /> 
      <xsd:element name="case" minOccurs="0" maxOccurs="unbounded" type="hw:caseType" /> 
     </xsd:sequence> 
     </xsd:sequence> 
     <xsd:attribute name="var" type="xsd:string" use="required" /> 
    </xsd:complexType> 

    <xsd:complexType name="configType" > 
    <xsd:sequence> 
     <xsd:element name="switch" type="hw:switchType" /> 
    </xsd:sequence> 
    <xsd:attribute name="name" type="xsd:string" /> 
    </xsd:complexType> 

    <xsd:element name="config" type="hw:configType" /> 

</xsd:schema> 

为什么这个模式不是-决定论?有什么方法可以改变这个,使它成为决定论者吗?

+0

这部分对我来说似乎还可以。你确定问题是由这些行引起的吗?你能展示整个模式吗? – toniedzwiedz 2012-07-05 10:44:10

+0

我用整个文件内容替换了片段。这就是libxml版本20706拒绝它的方式。 – fermeise 2012-07-05 12:27:50

+0

现在JAXP接受XSD。这可能是libxml的一个问题。 – fermeise 2012-07-05 12:36:57

回答

0

正如其他人指出的,这似乎是xmllint(或者说libxml)中的一个bug。等同的DTD没有任何问题 - 即声明

<!ELEMENT switch (case*, (default, case*)?) > 

被接受而没有投诉。所以看起来这个错误纯粹在XSD支持中,而不是在更普遍的确定性检查中。

一种解决方法是替换(...)? (默认,案例*)和空序列之间进行选择:

<xsd:complexType name="switchType" > 
    <xsd:sequence> 
    <xsd:element name="case" 
       minOccurs="0" maxOccurs="unbounded" 
       type="hw:caseType" /> 
    <xsd:choice> 
     <xsd:sequence/> 
     <xsd:sequence> 
     <xsd:element name="default" type="hw:defaultType" /> 
     <xsd:element name="case" 
        minOccurs="0" maxOccurs="unbounded" 
        type="hw:caseType" /> 
     </xsd:sequence> 
    </xsd:choice> 
    </xsd:sequence> 
    <xsd:attribute name="var" type="xsd:string" use="required" /> 
</xsd:complexType>