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

How to make type depend on attribute value using Conditional Type Assignment

提问人:DropDropped 提问时间:1/11/2015 最后编辑:DeduplicatorDropDropped 更新时间:2/11/2015 访问量:9679

问:

我有一个这样的XML文件

<listOfA>
  <a type="1">
    <name></name>
    <surname></surname>
  </a>
  <a type="2">
    <name></name>
    <id></id>
  </a>
</listOfA>

我想制作一个 XSD,这样,如果属性“type”的值为 1,则必须存在 name 和 surname 元素,而当它为 2 时,name 和 id 必须存在。我试图在 XSD 架构生成器中生成 XSD,但它使 surname 和 id 元素 minOccurs=0。我怎样才能让它工作?

xml xsd 验证 xsd-1.1

评论

1赞 kjhughes 1/11/2015
这是 XSD 1.1 中的条件类型赋值所涵盖的情况。您能使用 XSD 1.1 吗?您将无法单独使用 XSD 1.0 强制实施此类约束;需要在 XSD 1.0 中使用可选性,然后在 XSD 之外进行绑定。
0赞 DropDropped 1/11/2015
@kjhughes XSD 1.1 没问题

答:

9赞 kjhughes 1/11/2015 #1

您可以使用 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>

评论

0赞 Jan Bergström 7/24/2016
MS VS 2015 在将其复制 (abover) 到空页面时确实会出错“此上下文不支持'w3.org/2001/XMLSchema:alternative'元素”,
1赞 kjhughes 7/25/2016
这是因为 .NET 不直接支持 XSD 1.1(此问题表明这是可以接受的)。如果您使用的是 .NET 并希望使用 XSD 1.1,请要求 Microsoft 添加支持,或使用 Saxon。
0赞 Jan Bergström 7/26/2016
很好的解释。据我所知,这是 XSD 1.1 的主要弱点,它不是新的,也没有太多实现?因此,在商业标准软件中使用(就像我一样)有问题,与内部工作不同?据我所知,“<xs:alternative test=”是在 XSD 中引导变量正确路径的唯一方法,不是吗?
0赞 kjhughes 7/26/2016
如果可以重新设计 XML,则可以避免对 XSD 1.1 和 CTA 的需求。(思考而不是 .)但是,请提出一个新问题,而不是在评论中向多个方向扩展讨论。谢谢。<typeA/><item type="typeA"/>
2赞 kjhughes 8/21/2017
@Sander:如果您无法从其文档中确定 ColdFusion 是否支持 XSD 1.1,您可以随时尝试一下。如果它不支持 XSD 1.1,则应收到有关包装与预期 XSD 1.0 内容模型 () 不匹配的元素内容的错误。xs:alternative(annotation?, (simpleType | complexType)?, (unique | key | keyref)*)