簡體   English   中英

XSD驗證元素取決於父節點

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM