XSD 1.1条件类型赋值<alternative test =“”>检查元素是否没有设置属性?</alternative>

时间:2014-08-07 20:14:00

标签: xml xpath xsd-validation xsd-1.1

我想问一下,如果某个元素没有使用XPath查询的属性,有人知道如何进行XSD 1.1条件类型赋值检查,例如:

<!--inline alternative type definitions --> 
<element name="TimeTravel" type="TravelType"> 
      <alternative test="@direction='Future'"> 
          <complexType> 
              <complexContent> 
              <restriction base="TravelType" 
                         .... 
<!--        some past travel related elements go here --> 
            </complexType> 
       </alternative> 
      <alternative test="@direction='Past'"> 
          <complexType> 
              <complexContent> 
              <restriction base="TravelType" 
                         .... 
   <!--        some future travel related elements go here --> 
            </complexType> 
       </alternative> 
  </element> 
                          OR 
<!--Named alternative type definitions --> 
<element name="TimeTravel" type="TravelType"> 
   <alternative test="@direction='Future' type="FutureTravelType"/> 
   <alternative test="@direction='Past' type="PastTravelType"/> 
</element>

在此示例中,替代测试=&#34;&#34;&#39;检查属性&#34;方向&#34; TimeTravel元素的值为&#34; Future&#34;或&#34;过去&#34;。我应该如何编写XPath查询以检查是否例如没有&#34;方向&#34;当前元素的属性?

1 个答案:

答案 0 :(得分:7)

XPath "@direction"将测试当前元素的direction属性的状态

<alternative test="@direction" type="DirectionType"/>

XPath "not(@direction)"将测试当前元素的direction属性的缺席

<alternative test="not(@direction)" type="NoDirectionType"/>

另请注意,alternative/@test属性可以完全省略,以提供默认类型。

<alternative type="DefaultType"/>

根据OP的后续问题更新以解决CTA子集模式

  

所以这个<alternative test="@direction='a_value' and not(@another_attribute)"/>是正确的并且会使它正确吗?

是的,但请注意,默认情况下,您的XSD处理器可能会使用XPath CTA(Conditional Type Assignment)子集。 (例如,Xerces,因此大多数基于Xerces的工具都这样做。)如果是这种情况,您将收到类似这样的错误:

  

c-cta-xpath:XPath表达式'not(@direction)'无法编译   在CTA评估期间成功进入'cta-subset'模式。

     

c-cta-xpath:XPath表达式'@ direction ='a_value'和   not(@another_attribute)'无法在'cta-subset'中成功编译   模式,在CTA评估期间。

要使用完整的XPath 2.0而不是CTA子集,请相应地配置您的工具。例如,对于Xerces,将以下功能设置为“true”:

http://apache.org/xml/features/validation/cta-full-xpath-checking

在oXygen中,Options > Preferences > XML > XML Parser > XML Schema中有一个复选框,可以为您控制该功能的值。

使用完整的XPath 2.0,是的,您可以按照评论中建议的方式使用and