2011-02-23 121 views
3

我有XML模式的問題。我需要內部的三個類型中的一種元素的元素,但沒有任何其他限制,其次是元素output的只有一個發生:XSD - 任何順序和數量的元素(XML使用XSD驗證XERCES)

<command path="app.exe" workingDir="/usr/local/bin"> 
    <param name="--name" assign="=">anyName</param> 
    <switch name="--verbose"/> 
    <param name="--config">/etc/app/conf.txt</param> 
    <param name="--overriding">~/app/conf.txt</param> 
    <switch name="-d"/> 
    <param name="--report" assign="=">~/app/report.txt</param> 
    <param name="--template">~/app/templates/default.tt</param> 
    <string>../t/${testName}/log.txt</string> 
    <output> 
     <out path="stdout.txt"/> 
     <err path="stderr.txt"/> 
    </output> 
</command> 

我可以只使用sequenceallchoice,但沒有他們中的一個滿足我的要求。序列 - 按照確切順序的任意次數。全部 - 以任何順序零次或一次。選擇 - 只有其中之一。我找到了one solution on this web,但它不適用於Xerces。我試試這個:

<xs:complexType name="commandType"> 
    <xs:sequence> 
     <xs:group ref="gupa"/> 
     <xs:element name="output" type="outputType" minOccurs="1" maxOccurs="1"/> 
    </xs:sequence> 
    <xs:attribute name="path" use="required" type="value"/> 
    <xs:attribute name="workingDir" use="required" type="value"/> 
</xs:complexType> 

<xs:group name="gupa"> 
    <xs:choice> 
     <xs:element name="env" type="pair" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element name="switch" type="switchType" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element name="string" type="value" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:choice> 
</xs:group> 

但我得到的錯誤:無效的含量被發現開始元素「開關」。其中'{param,output}'預計爲。有一個竅門。

If maxOccurs="unbounded" is moved from elements to element choice in schema, then can any of elements appear in any order in any number of times.

然而,當我這樣做,我得到的錯誤:屬性「maxOccurs的」不能出現在元素「選擇」

我巡航跨越互聯網,但我仍然沒有發現什麼我在找。

回答

5

您可以將三種元素類型放在一個選項中,然後將選擇放入另一個序列的序列中。

<xs:group name="mygr"> 
    <xs:choice> 
     <xs:element name="string"></xs:element> 
     <xs:element name="param"></xs:element> 
     <xs:element name="switch"></xs:element> 
     <xs:element name="env"></xs:element> 
    </xs:choice> 
    </xs:group> 

    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence > 
     <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
      <xs:group ref="mygr"/> 
     </xs:sequence> 
     <xs:element name="output"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

這就是你已經有的,但輸出是一個更高的水平。

+0

謝謝,它現在有效。 – 2011-02-24 07:37:24