2012-07-05 68 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>