如何使用条件类型赋值使类型依赖于属性值

Dro*_*ped 5 xml xsd xsd-validation xsd-1.1

我有这样的XML文件

<listOfA>
  <a type="1">
    <name></name>
    <surname></surname>
  </a>
  <a type="2">
    <name></name>
    <id></id>
  </a>
</listOfA>
Run Code Online (Sandbox Code Playgroud)

我想创建一个XSD,这样如果属性"type"的值为1,则必须存在name和surname元素,当它为2时,name和id必须在那里.我试图在XSD架构生成器中生成XSD ,但它使surname和id元素minOccurs = 0.我怎么能让它工作?

kjh*_*hes 7

您可以使用XSD 1.1的条件类型分配执行此操作:

<?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"
           vc:minVersion="1.1"> 
  <xs:element name="listOfA">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="a" maxOccurs="unbounded">
          <xs:alternative test="@type = 1" type="a1Type"/>        
          <xs:alternative test="@type = 2" type="a2Type"/>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="a1Type">
    <xs:sequence>
      <xs:element name="name"/>
      <xs:element name="surname"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="a2Type">
    <xs:sequence>
      <xs:element name="name"/>
      <xs:element name="id"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

  • @Sander:如果你无法从文档中确定ColdFusion是否支持XSD 1.1,你可以随时尝试一下.如果它不支持XSD 1.1,那么你应该收到一个关于包含`xs:alternative`的元素内容与预期的XSD 1.0内容模型不匹配的错误(`(annotation?,(simpleType | complexType)?,( unique | key | keyref)*)`). (2认同)