XSD 个名称相同但类型不同的元素
XSD elements with same name but different types
我需要编写一个 XSD 来验证属性和元素的值。到目前为止,我能够验证属性但不能验证值。提前感谢您的帮助。
我的XML:
<params>
<param dataType="java.lang.String">12A</param>
<param dataType="java.lang.Integer">6455</param>
<param dataType="oracle.jbo.domain.Date">2014-10-01</param>
<param dataType="oracle.jbo.domain.Date">2018-10-01</param>
<param dataType="java.lang.String">H1</param>
<param dataType="java.lang.String">4235AS</param>
<param dataType="java.lang.String">5aZ</param>
<param dataType="java.lang.String">q2w</param>
<param dataType="java.lang.Integer">10</param>
<param dataType="java.lang.Integer">3</param>
</params>
我的XSD
<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="params">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="10"
name="param" type="paramType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="paramType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="dataType" type="validAttributeType" use="optional" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="validAttributeType">
<xs:restriction base="xs:string">
<xs:enumeration value="java.lang.String" />
<xs:enumeration value="java.lang.Integer" />
<xs:enumeration value="oracle.jbo.domain.Date" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
所以我的需要是,如果数据类型为整数,它应该只接受数字作为值,或者如果它为日期,那么该值应该是日期而不是其他任何东西。
XSD 1.0
无法在 XSD 1.0 中完成基于属性值的类型检查。
XSD 1.1
您可以使用Condition Type Assignment:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="params">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="10" name="param">
<xs:alternative test="@dataType='java.lang.String'" type="xs:string"/>
<xs:alternative test="@dataType='java.lang.Integer'" type="xs:integer"/>
<xs:alternative test="@dataType='oracle.jbo.domain.Date'" type="xs:date"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
虽然这是表示基于属性的类型的正确结构,但您应该注意 XSD 类型在某些情况下可能与 Java 类型不同,因此请检查以确保根据您的要求,任何差异都是可以容忍的。
我需要编写一个 XSD 来验证属性和元素的值。到目前为止,我能够验证属性但不能验证值。提前感谢您的帮助。
我的XML:
<params>
<param dataType="java.lang.String">12A</param>
<param dataType="java.lang.Integer">6455</param>
<param dataType="oracle.jbo.domain.Date">2014-10-01</param>
<param dataType="oracle.jbo.domain.Date">2018-10-01</param>
<param dataType="java.lang.String">H1</param>
<param dataType="java.lang.String">4235AS</param>
<param dataType="java.lang.String">5aZ</param>
<param dataType="java.lang.String">q2w</param>
<param dataType="java.lang.Integer">10</param>
<param dataType="java.lang.Integer">3</param>
</params>
我的XSD
<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="params">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="10"
name="param" type="paramType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="paramType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="dataType" type="validAttributeType" use="optional" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="validAttributeType">
<xs:restriction base="xs:string">
<xs:enumeration value="java.lang.String" />
<xs:enumeration value="java.lang.Integer" />
<xs:enumeration value="oracle.jbo.domain.Date" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
所以我的需要是,如果数据类型为整数,它应该只接受数字作为值,或者如果它为日期,那么该值应该是日期而不是其他任何东西。
XSD 1.0
无法在 XSD 1.0 中完成基于属性值的类型检查。
XSD 1.1
您可以使用Condition Type Assignment:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="params">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="10" name="param">
<xs:alternative test="@dataType='java.lang.String'" type="xs:string"/>
<xs:alternative test="@dataType='java.lang.Integer'" type="xs:integer"/>
<xs:alternative test="@dataType='oracle.jbo.domain.Date'" type="xs:date"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
虽然这是表示基于属性的类型的正确结构,但您应该注意 XSD 类型在某些情况下可能与 Java 类型不同,因此请检查以确保根据您的要求,任何差异都是可以容忍的。