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
Java xercesJ for XSD 1.1:Validator正确地处理断言,而SAXParser显然没有_Java_Xml_Validation_Xsd - Fatal编程技术网

Java xercesJ for XSD 1.1:Validator正确地处理断言,而SAXParser显然没有

Java xercesJ for XSD 1.1:Validator正确地处理断言,而SAXParser显然没有,java,xml,validation,xsd,Java,Xml,Validation,Xsd,我正在为我的java项目构建一个带有 xerces-2_11_0-xml-schema-1.1-beta库,以支持XSD 1.1特定功能,如断言 考虑到这个模式 <?xml version="1.1" encoding="UTF-8"?> <schema targetNamespace="http://www.example.org/Example" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XML

我正在为我的java项目构建一个带有 xerces-2_11_0-xml-schema-1.1-beta库,以支持XSD 1.1特定功能,如断言

考虑到这个模式

<?xml version="1.1" encoding="UTF-8"?>
<schema targetNamespace="http://www.example.org/Example" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.org/Example">

    <complexType name="NodeType">
        <sequence>
            <element name="Node" type="tns:NodeType"
                maxOccurs="unbounded" minOccurs="0">
            </element>
        </sequence>
        <attribute name="partnumber">
            <simpleType>
                <restriction base="string">
                    <pattern value="[A-Z0-9_\-]+"></pattern>
                </restriction>
            </simpleType>
        </attribute>
        <assert test="starts-with(@partnumber,../@partnumber)"/>
    </complexType>

    <element name="Node" type="tns:NodeType"></element>
</schema>
此解决方案有效:example.xsd中的断言测试得到正确处理,xml文件的验证顺利运行(断言测试得到正确评估)

然后我用sax解析器替换了验证器(原因:为了更好地控制sax解析阶段)

在第二种情况下,解析阶段在xsd“assert”子句上遇到错误,并显示以下消息:

s4s-elt-invalid-content.1: The content of 'NodeType' is invalid.  Element 'assert' is invalid, misplaced, or occurs too often.
如果我删除example.xsd中的assert子句(从而使其符合1.0),验证将正确运行,因此我认为SAXParser仍在使用1.0规范


在配置SAXParserFactory或SAXParser本身以坚持1.1模式规则时,我是否遗漏了什么?

我认为您的项目中缺少XPATH 2.0依赖性。请检查一下

XML模式1.1“断言”和“类型替代项”需要XPath 用于评估的2.0处理器。对于XSD1.1断言,需要完整的XPath2.0支持。对于XSD1.1类型的替代方案,XML模式引擎 可以提供完整的XPath2.0支持,也可以实现更小的 XPath2.0子集,由XSD1.1语言定义

发件人:

考虑到同一个项目中的验证器可以工作,我认为它利用了相同的XPath处理器。。因此,我认为依赖关系是正确的:我的项目引用了“org.eclipse.wst.xml.xpath2.processor”jar,它与“xerces-2_11_0-xml-schema-1.1-beta”包捆绑在一起,我想它包含XPath 2.0处理器
...
SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
Schema s = sf.newSchema(new File("example.xsd"));

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setSchema(s);
spf.setNamespaceAware(true);
spf.setValidating(true);
spf.setFeature("http://apache.org/xml/features/validation/schema", true);

SAXParser parser = spf.newSAXParser();
XMLReader r = parser.getXMLReader();
r.setErrorHandler(new MyErrorHandler())
r.parse("example.xml");
...
s4s-elt-invalid-content.1: The content of 'NodeType' is invalid.  Element 'assert' is invalid, misplaced, or occurs too often.