根据属性验证不同的范围

时间:2013-11-27 11:50:41

标签: xml xsd

假设有一个这样的XML文档:

<?xml version="1.0" encoding="utf-8"?>
<Angles>
  <angle unit="DEG">45</angle>
  <angle unit="RAD">0,7854</angle>   
</Angles>

是否可以定义一个xsd模式,该模式根据相应的范围验证角度数? (即0到360度为0度 - 2pi为rad)。

1 个答案:

答案 0 :(得分:1)

您可以定义degTyperadType这样的内容:

<xs:simpleType name="degType">
  <xs:restriction base="xs:unsignedShort">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="360"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="radType">
  <xs:restriction base="xs:decimal">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="6.28318530718"/>
  </xs:restriction>
</xs:simpleType>

然后在 XSD 1.1 中,您可以使用条件类型赋值:

<xs:element name="angle" type="xs:anyType">
  <xs:alternative test="@unit='DEG'" type="degType"/>
  <xs:alternative test="@unit='RAD'" type="radType"/>
  <xs:alternative test="@unit" type="xs:error"/>
  <xs:alternative type="xs:string"/>
</xs:element>

XSD 1.0 中,您可以

  • 在引用xsi:typeangle的XML中的degType上使用radType
  • 使用不同的元素名称(angleDeg / angleRad)。

根据OP的要求......

XSD 1.0的xsi:type技术示例如下:

此XML文档实例:

<?xml version="1.0" encoding="utf-8"?>
<Angles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="try.xsd">
  <angle xsi:type="degType">45</angle>
  <angle xsi:type="radType">0.7854</angle>   
</Angles>

使用此XSD 1.0架构成功验证:

<xs:schema version="1.0"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="degType">
    <xs:restriction base="xs:unsignedShort">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="360"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="radType">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="6.28318530718"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="Angles">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="angle" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

使用Xerces2 Java 2.11.0。