[英]XSD validate element depending on parent node
<a>
可以包含文本和<i>
标记, <i>
可以包含文本和<a>
标记。
<a>lol<i>so rad</i></a> - valid
<i>so sweet <a>lolz</a></i> - valid
我当前的解决方案有一个严重的缺陷,下一个是“ valid”,因为将cos内部<a>
包装在<i>
。
<a>so what now <i>so sweet <a>lolz</a></i></a>
我想测试<i>
父元素,所以如果<a>
子元素位于<a>
标记内,则可以禁止它。
当前的XSD:
<xs:element name="a">
<xs:complexType>
<xs:complexContent>
<xs:extension base="bodyMixed">
<xs:attribute name="href" type="xs:anyURI" use="required" />
<xs:attribute name="target" type="xs:string" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="bodyMixed" mixed="true">
<xs:group ref="fontStyle" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:complexType name="basic" mixed="true">
<xs:sequence>
<xs:element ref="a" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:group name="fontStyle">
<xs:choice>
<xs:element name="i" type="basic"/>
</xs:choice>
</xs:group>
处理这种情况的最简单方法是使用Schematron或XSD 1.1中的断言。 由于XSD断言无法在树中有效查找,因此您需要为a
编写断言,断言所讨论的a
元素没有名为a
后代。 因此,它是外部a
,而不是内部a
,这将是无效的。 (Schematron的是关于什么的断言可以参考少挑剔,所以你可以很容易地编写一个Schematron规则,使内部而不是外部a
,或者i
的内a
,是无效的。)
如果您无权访问断言(例如,因为您使用的是XSD 1.0),则将需要使用本地元素声明所提供的有限上下文感知,并在此旧XSD工作论文中进行了介绍 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.