Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSD 1.1:使用断言根据父属性限制元素_Xml_Xpath_Xsd_Schema_Assertion - Fatal编程技术网

Xml XSD 1.1:使用断言根据父属性限制元素

Xml 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

给定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>
            <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!我曾假设,由于断言是在测试元素的子树上操作的,所以所有子元素都是“局部变量”。但是添加正确的名称空间成功了!