2010-11-30 106 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验证以允许任何整数值并允许该元素为空。