XML模式:与同名但不同类型的节点基于属性值(Xml Schema: Nodes with same

2019-10-17 15:54发布

我需要完成这样的模式:

<object type="possession">
  <property name="VIN">1111111111111111</property>
  <property name="Year">2003</property>
  <property name="Make">Chevrolet</property>
</object>
  • 该“VIN”属性必须是17个字符
  • “年物业类型必须为gYear的
  • “品牌”属性必须符合{福特,雪佛兰,马自达}的枚举

现在,我有这样的:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="object">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded" minOccurs="0">
        <xs:element name="property" maxOccurs="1" minOccurs="0" type="VinType"></xs:element>
        <xs:element name="property" maxOccurs="1" minOccurs="0" type="YearType"></xs:element>
        <xs:element name="property" maxOccurs="1" minOccurs="0" type="MakeType"></xs:element>
      </xs:choice>
      <xs:attribute name="type" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>


  <!-- Vehicle Identification number (VIN) -->
  <xs:simpleType name="VinRestriction">
    <xs:restriction base="xs:string">
      <xs:length fixed="true" value="17"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="VinType" mixed="true">
    <xs:simpleContent>
      <xs:extension base="VinRestriction">
        <xs:attribute name="name" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="VIN" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>


  <!-- Vehicle Year -->
  <xs:simpleType name="YearRestriction">
    <xs:restriction base="xs:gYear"/>
  </xs:simpleType>

  <xs:complexType name="YearType" mixed="true">
    <xs:simpleContent>
      <xs:extension base="YearRestriction">
        <xs:attribute name="name" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="Year" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <!-- Vehicle Make -->
  <xs:simpleType name="MakeRestriction">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Chevrolet"/>
      <xs:enumeration value="Ford"/>
      <xs:enumeration value="Mazda"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="MakeType" mixed="true">
    <xs:simpleContent>
      <xs:extension base="MakeRestriction">
        <xs:attribute name="name" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="Make" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>

Answer 1:

这是XSD 1.0的一个众所周知的限制,你不能做到这一点:一个元素的类型由元素来决定。 这个问题通常被称为“共生约束”,如果你对这个词搜索,你会发现大量的参考资料。

它可以在1.1 XSD使用“条件式分配”的新工厂来完成。 XSD 1.1当前在Xerces的(测试版)和撒克逊(EE 9.4)来实现。

解决这个问题的另一种方法是使用管道,首先做一个转型做验证,然后验证。 该变换通常会改变<property name="VIN">1111111111111111</property><VIN>11111111111111111</VIN>



文章来源: Xml Schema: Nodes with same name but different types based on attribute value
标签: xml schema