提问人:DropDropped 提问时间:1/11/2015 最后编辑:DeduplicatorDropDropped 更新时间:2/11/2015 访问量:9679
如何使用条件类型赋值使类型依赖于属性值
How to make type depend on attribute value using Conditional Type Assignment
问:
我有一个这样的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。我怎样才能让它工作?
答:
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)*)
评论