2010-11-30 102 views
6

我的問題(或問題)以輸入爲xs:integer的空元素爲中心。我需要允許空元素,所以我使用聯合來允許空元素或有效整數作爲值,如下面的架構中所示。但是,我的模式擔當雙重角色,並且需要導入到期望數據類型爲String,Float,Integer或Date的第三方軟件中。如果我使用union方法爲所有整數編碼模式,它們將不會在軟件中鍵入爲整數。除了允許整數數據類型爲空元素的聯合方法之外,還有其他方法嗎?我想只有一個XSD,但可以有兩個,如果這是需要發生的。XSD:在聲明xs時允許空值的選項:整數數據類型

鑑於XML示例:

<?xml version="1.0" encoding="UTF-8"?> 
<company> 
    <division> 
     <department> 
      <roles/> 
      <employees>7</employees> 
     </department> 
    </division> 
</company> 

和架構:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:simpleType name="nullval"> 
     <xs:union memberTypes="IntegerType empty"/> 
    </xs:simpleType> 
    <xs:simpleType name="IntegerType"> 
     <xs:restriction base="xs:integer"/> 
    </xs:simpleType> 
    <xs:simpleType name="empty"> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="0"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:element name="company"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="division"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="department" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <!-- elements may appear in any order --> 
            <xs:all minOccurs="0" maxOccurs="1"> 
             <xs:element name="roles" type="nullval"/> 
             <xs:element name="employees" type="xs:integer"/> 
            </xs:all> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

回答

9

你試過

<xs:element name="roles" type="xs:integer" nillable="true"/> 
+0

是的,我試圖nillable =「true」和minOccurs =「0」,它沒有工作(與撒克遜使用XMLSpy)。 – johkar 2010-11-30 15:53:50

+0

您是否對發送的XML有任何控制權?你可以在角色元素上設置xsi:nil =「true」嗎? (參考http://www.w3.org/TR/xmlschema11-1/#xsi_nil) – sho222 2010-12-01 20:16:51

5

喜的nillable = 「true」 和的minOccurs = 「0」只有當你根本不發送標籤時纔有效。 但是如果你需要在標籤內傳遞一個空值,我認爲你必須實現一個聯合。

0

我今天有同樣的要求。以下XSD只允許空或-1到999之間的任何值

我只從一個非常大的XSD中提取所需的東西,因此其中一些看起來可能過於矯枉過正。

<xs:simpleType name="emptyString"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value=""/> 
    </xs:restriction> 
</xs:simpleType> 


<xs:simpleType name="int-1999"> 
<xs:restriction base="xs:int"> 
<xs:minInclusive value="-1"/> 
<xs:maxInclusive value="999"/> 
</xs:restriction> 
</xs:simpleType> 


<xs:element name="preNotificationPeriod" nillable="true"> 
    <xs:simpleType> 
    <xs:union memberTypes="int-1999 emptyString"/> 
    </xs:simpleType> 
</xs:element> 

參考 - http://www.ilearnttoday.com/xsd-empty-values-and-range-restriction-for-numeric-types

More details on this article

5

,你所要做的就是在相同的元素分配兩個限制,再加上使他們的工會,如下面的例子:

<xs:element name='job_code'> 
    <xs:simpleType> 
    <xs:union> 
     <xs:simpleType> 
     <xs:restriction base='xs:string'> 
      <xs:length value='0'/> 
     </xs:restriction> 
     </xs:simpleType> 
     <xs:simpleType> 
     <xs:restriction base='xs:integer'> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:union> 
    </xs:simpleType> 
</xs:element> 

使用此限制,您告訴XML驗證以允許任何整數值並允許該元素爲空。