鉴于XML
<test type="a">
<foo>1</foo>
<bar>2</bar>
</test>
如果@type不是“a”,我想做一些简单的事情,比如使用XSD断言来禁止使用元素“foo”。我在以下架构中尝试过断言:
<xs:element name="test">
<xs:complexType>
<xs:sequence>
<xs:element name="foo"/>
<xs:element name="bar"/>
</xs:sequence>
<xs:attribute name="type">
<xs:simpleType>
<xs:restriction base="xs:Name">
<xs:enumeration value="a"/>
<xs:enumeration value="b"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:assert test="not(@type='b' and exists(foo))"/>
</xs:complexType>
</xs:element>
但这不起作用。我正在使用Oxygen,而Oxygen又使用了Saxon验证器,并且断言总是失败。否则断言工作(声明test="@type='b'"
正确拒绝上述XML片段)但由于某种原因,我无法测试test
是否存在子元素。我也试过exists(./foo)
和count(foo) gt 0
无济于事。
我是否误解了有关xpath语法的内容?