2016-07-22 38 views
0

假設我有以下XSD文件:如何將限制與XSD文件中的出現指示符結合使用?

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="PACIDemoSignedDoc" type="PACIDemoSignedDocType" /> 
    <xs:complexType name="PACIDemoSignedDocType"> 
     <xs:all> 
      <xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" /> 
     </xs:all> 
    </xs:complexType> 
    <xs:complexType name="OwnerEnglishNameType"> 
     <xs:simpleContent> 
      <xs:restriction base="NameType"> 
       <xs:enumeration value="John"/> 
       <xs:enumeration value="Jack"/> 
      </xs:restriction> 
     </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="NameType"> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"/> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:schema> 

我的問題是,我應該在哪裏添加屬性的minOccurs和maxOccurs的元素「OwnerEnglishName」?我想保留xs:所有,因爲我想避免必須按順序排序我的XML文件,但它禁止直接在<xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" /> 行中添加Occurs ...

我也猜測我不能添加OwnerEnglishNameType中的Occur屬性,任何人有任何想法?

+0

這是誰「禁止[你]添加」?我看不到,爲什麼''(或類似的)不應該工作。 –

+0

我想你的意思是錯誤'F [Saxon-EE 9.4.0.4]在之內,必須有@maxOccurs等於0或1'。請指定您想要的'minOccurs'和'maxOccures'值。 –

+0

準確地說,我想添加不同於0和1的值:我沒有任何價值,我只需要爲這些屬性輸入任何值即可。 – Yohann

回答

-1

好了,我已經解決了我的問題,這裏的答案,如果別人有同樣的問題:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" targetNamespace="test" xmlns="test" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="animal" type="AnimalType" /> 
    <xs:complexType name="AnimalType"> 
     <xs:all> 
      <xs:element name="cats" type="Cats" /> 
     </xs:all> 
    </xs:complexType>  
    <xs:simpleType name="CatType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="John"/> 
      <xs:enumeration value="Jack"/> 
     </xs:restriction> 
    </xs:simpleType>  
    <xs:complexType name="Cats"> 
     <xs:sequence> 
      <xs:element maxOccurs="5" minOccurs="2" name="cat" type="Cat"/> 
     </xs:sequence> 
    </xs:complexType>  
    <xs:complexType name="Cat"> 
     <xs:simpleContent> 
      <xs:extension base="CatType"/> 
     </xs:simpleContent> 
    </xs:complexType>  
</xs:schema> 

這驗證以下XML:

<?xml version="1.0" encoding="UTF-8"?> 
<animal xmlns="d" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test schema.xsd"> 
    <cats> 
     <cat>John</cat> 
     <cat>Jack</cat> 
    </cats> 
</animal> 

我已成功通過添加xs:sequence後面的子元素來繞過xs:all的Occurs限制。

+0

*我已經成功繞過'xs:all' *的發生限制:**不,你沒有。**你**(1)**改變了示例(爲什麼?),* *(2)**仍然使用帶有單個子元素的'xs:all'(它不會購買任何東西),並且**(3)**應用了[着名的包裝技術](http://stackoverflow.com/questions/37969890/unordered-elements-in-xsd-with-obligatory-and-unbounded-elements)(它不會繞過限制但改變XML設計以在其中工作)。 – kjhughes

0

我的問題是,我應該在哪裏添加屬性minOccurs和 的maxOccurs的元素OwnerEnglishName

OwnerEnglishName(非全局)聲明:

<xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" 
      minOccurs="0" maxOccurs="1"/> 

我想保持XS:所有我想避免下令在我的XML文件>序列

在XSD 1.0中,您不能在xs:all下有maxOccurs =「unbounded」;在XSD 1.1中,你可以。

但是,您不需要帶有單個子元素的xs:all;您可以使用xs:sequence,因爲沒有第二個元素用於處理重要事項。


更新(每例如在評論OP變化包括額外的子元素xs:all):

然後,您有三種選擇:

  1. 強加排序。這幾乎總是最好的答案,因爲 被認爲需要允許任何排序在實踐中幾乎總是不必要的 。
  2. 使用XSD 1.1,允許xsd:all的子女擁有maxOccurs="unbounded"
  3. 將XML設計更改爲在您希望允許重複的xsd:all的子元素周圍使用包裝元素。 (對於一個例子見here
+0

問題是,最後,我會有多個子元素。真的沒有解決方法嗎?我一直在拼命努力,使一些工作是這樣的: 所以基本上將序列定義爲「所有」元素的子元素以繞過Occur限制。 我是在努力做一些最終毫無意義的事情,或者您認爲這樣的解決方案可行嗎? – Yohann

+0

然後你的例子應該顯示'xsd:all'的多個子元素,而不是一個。您有三種選擇:請參閱** [XSD中的無序元素,帶有強制和無界元素?](http://stackoverflow.com/questions/37969890/unordered-elements-in-xsd-with-obligatory-and-unbounded-elements )** – kjhughes

相關問題