如何在XSD中为不同的整数类型使用条件类型赋值

时间:2014-09-29 07:43:49

标签: xml xsd xsd-1.1

XSD1.1允许元素的类型依赖于其中一个属性。例如,

<integer kind='s'>100</integer>

会导致&#39;元素的类型&#39;是xs:短。这是我得到的:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified"
           vc:minVersion="1.1">
   <xs:complexType name="GenericInt">
      <xs:simpleContent>
         <xs:extension base="xs:integer">
            <xs:attribute name="kind" type="xs:string"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
   <xs:element name="integer" type="GenericInt">
      <xs:alternative test="@kind='b'" type="xs:byte"/>
      <xs:alternative test="@kind='s'" type="xs:short"/>
      <xs:alternative test="@kind='i'" type="xs:int"/>
      <xs:alternative test="@kind='l'" type="xs:long"/>
      <xs:alternative                  type="GenericInt"/>
   </xs:element>
</xs:schema>

当我尝试在Altova XMLSpy中保存文件时,发生了错误:     cos-st-derived-ok.2:简单类型定义&#39; xs:byte&#39;不是来自GenericInt&#39;。

那么我该如何更正XSD代码?

2 个答案:

答案 0 :(得分:2)

另一种方法是

    <xs:complexType name="GenericInt">
      <xs:simpleContent>
         <xs:extension base="xs:integer">
            <xs:attribute name="kind" type="xs:string"/>
         </xs:extension>
      </xs:simpleContent>
      <xs:assert test="(@kind='b' and $value = (-128 to 127))
                       or (@kind='s' and $value = (-32768 to 32767))
                       or (....)"/>
   </xs:complexType>

虽然你不会那样得到精确的PSVI类型注释。

答案 1 :(得分:0)

好吧,我让它像这样工作:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified"
           vc:minVersion="1.1">
   <xs:complexType name="bInt">
      <xs:simpleContent>
         <xs:extension base="xs:byte">
            <xs:attribute name="kind" type="xs:string"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
   <xs:complexType name="sInt">
      <xs:simpleContent>
         <xs:extension base="xs:short">
            <xs:attribute name="kind" type="xs:string"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
   <xs:complexType name="iInt">
      <xs:simpleContent>
         <xs:extension base="xs:int">
            <xs:attribute name="kind" type="xs:string"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
   <xs:complexType name="lInt">
      <xs:simpleContent>
         <xs:extension base="xs:long">
            <xs:attribute name="kind" type="xs:string"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
   <xs:complexType name="gInt">
      <xs:simpleContent>
         <xs:extension base="xs:integer">
            <xs:attribute name="kind" type="xs:string"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
   <xs:element name="integer">
      <xs:alternative test="@kind='b'" type="bInt"/>
      <xs:alternative test="@kind='s'" type="sInt"/>
      <xs:alternative test="@kind='i'" type="iInt"/>
      <xs:alternative test="@kind='l'" type="lInt"/>
      <xs:alternative                  type="gInt"/>
   </xs:element>
</xs:schema>

有更好的解决方案吗?