[英]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.