繁体   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