XSD:声明xs:integer数据类型时允许空值的选项

joh*_*kar 11 xml schema xsd

我的问题(或问题)以空元素为中心,这些元素被输入为xs:integer.我需要允许空元素,所以我使用union来允许空元素或有效整数作为值,如下面的模式所示.但是,我的架构具有双重角色,还需要导入第三方软件,该软件需要String,Float,Integer或Date等数据类型.如果我使用union方法为所有整数编码模式,则它们不会在软件中键入为整数.除了允许空元素用于整数数据类型的union方法之外,还有其他方法吗?我想拥有一个XSD但如果需要的话可以有两个XSD.

给出XML样本:

<?xml version="1.0" encoding="UTF-8"?>
<company>
    <division>
        <department>
            <roles/>
            <employees>7</employees>
        </department>
    </division>
</company>
Run Code Online (Sandbox Code Playgroud)

和架构:

<?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>
Run Code Online (Sandbox Code Playgroud)

sho*_*222 13

你有没有尝试过

<xs:element name="roles" type="xs:integer" nillable="true"/>
Run Code Online (Sandbox Code Playgroud)

  • 是的,我尝试了 nillable="true" 和 minOccurs="0" 并且它不起作用(使用 XMLSpy 和 Saxon)。 (2认同)
  • 您对发送的 XML 有任何控制吗?您可以在角色元素上设置 xsi:nil="true" 吗?(参考 http://www.w3.org/TR/xmlschema11-1/#xsi_nil) (2认同)

小智 9

你要做的是为同一个元素分配两个限制,再加上它们的联合,如下例所示:

<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>
Run Code Online (Sandbox Code Playgroud)

使用此限制,您可以告诉XML验证允许任何整数值,并允许该元素为空.


小智 6

嗨nillable ="true"和minOccurs ="0"只有在你根本不发送标签时才有效.但是,如果你需要在标记内传递一个空值,我认为你必须实现一个联合.