【发布时间】:2013-01-30 08:11:01
【问题描述】:
我的目标是在 java 中使用 XSD 模式进行独立的 HTML 5 标记验证。
下面我将描述我的方法。 任何帮助表示赞赏 - 如果有替代或更好的方法来做到这一点。
WHATTF 发布了Relax NG / Schematron schema for HTML 5。
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。景 [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
但是,这会导致相同的错误。
除此之外,使用 javax.xml.validation.Validator 创建的 XSD 文件如下:
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
【问题讨论】:
-
为什么要转换架构?使用 Jing 对 RELAXNG 模式进行验证不是更容易吗?
-
我需要向 XSD 添加一些额外的架构元素,这些元素也应该得到验证。但你是对的,一种更简单的方法可能是直接将它们添加到 Relax NG 模式中,然后使用 jing,而不是绕过 XSD。
标签: java html validation xsd relaxng