我的目标是在 java 中使用 XSD 模式进行独立的 HTML 5 标记验证。
在下文中,我描述了我的方法。任何帮助表示赞赏 - 如果有替代或更好的方法来做到这一点。
WHATTF发布了针对 HTML 5的Relax NG/Schematron 模式。
Trang [3] 是一个用于不同 XML 模式语言的开源转换器,应该能够从 Relax NG 转换为 XSD。使用 WHATTF 模式,可以如下进行 trang 转换器调用:
$ java -jar ./trang.jar ./whattf/syntax/relaxng/html5.rnc html5.xsd
但是,trang 会在不正确的类型转换时产生以下许多警告:
whattf/syntax/relaxng/applications.rnc:265:51: warning: cannot convert datatype library "http://whattf.org/datatype-draft"; using datatype "string"
[...]
我认为要使 trang 正常工作,需要将 pluggable-datatypes [4] 传递给 jing。Jing [5] 是一个 Relax NG 验证器,我认为它被 trang 使用。
在 whattf/syntax/relaxng/datatype 文件夹中,提供了这些可插入数据类型的 java 实现。因此,我创建了一个 html5-datatypes.jar 并将其添加到 trangs 类路径中,如下所示:
$ java -cp ./html5-datatypes.jar -jar ./trang.jar ./whattf/syntax/relaxng/html5.rnc html5.xsd
但是,这会导致相同的错误。
除此之外,使用创建的 XSD 文件javax.xml.validation.Validator
如下:
SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = schemaFactory.newSchema( new File("html5.xsd") );
Validator validator = schema.newValidator();
validator.validate( new StreamSource( new File("example.html") ) );
产生异常:
org.xml.sax.SAXParseException: cos-element-consistent: Error for type 'time.inner'. Multiple elements with name 'script', with different types, appear in the model group.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XSConstraints.reportSchemaError(Unknown Source)
at org.apache.xerces.impl.xs.XSConstraints.fullSchemaChecking(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:594)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:610)
[3] thaiopensource.com/relaxng/trang.html
[4] thaiopensource.com/relaxng/pluggable-datatypes.html
[5] thaiopensource.com/relaxng/jing.html