Xml XSD 1.1:使用断言根据父属性限制元素
给定XMLXml XSD 1.1:使用断言根据父属性限制元素,xml,xpath,xsd,schema,assertion,Xml,Xpath,Xsd,Schema,Assertion,给定XML <test type="a"> <foo>1</foo> <bar>2</bar> </test> 1. 2. 我想做一些简单的事情,比如使用XSD断言来禁止使用元素“foo”,如果@type不是“a”。我尝试了以下模式中的断言: <xs:element name="test"> <xs:complexType> <xs:sequence
<test type="a">
<foo>1</foo>
<bar>2</bar>
</test>
1.
2.
我想做一些简单的事情,比如使用XSD断言来禁止使用元素“foo”,如果@type不是“a”。我尝试了以下模式中的断言:
<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,它反过来使用Saxon验证器,断言总是失败。断言在其他情况下起作用(断言test=“@type='b'”
正确地拒绝上述XML片段),但由于某些原因,我无法测试是否存在要测试的子元素test
。我还尝试了exists(./foo)
和count(foo)gt 0
,但没有成功
我是否误解了xpath语法?欢迎使用堆栈溢出!感谢您提供了一个最低限度的工作示例。但我无法复制这个问题:对我来说,Oxygen15.2接受您提供的XML文档,并拒绝使用
type='b'
的类似文档,无论我是将验证器设置为Saxon还是Xerces。所以这看起来像是个鬼问题。我有时发现自己被旧的错误消息缓冲区弄糊涂了(因为氧气不会神奇地注意到它们不再是最新的)。所以,如果是我,我会建议重新启动Oxygen,或者确保所有缓冲区和缓存都是最新的。我想知道是否涉及到名称空间?如果元素foo位于名称空间中,则需要相应地调整XPath表达式。感谢热情的欢迎!这确实是一个名称空间问题,所以谢谢你,Michael!我曾假设,由于断言是在测试元素的子树上操作的,所以所有子元素都是“局部变量”。但是添加正确的名称空间成功了!