我想问一下,如果某个元素没有使用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;当前元素的属性?
答案 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"/>
所以这个
<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
。