2

我的目标是在 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

4

2 回答 2

1

Web 中似乎有一些 XHTML 5 XSD。例如,在以下位置有一个开源 XHTML 5 Schema:http ://www.xmlmind.com/xmleditor/download.shtml

于 2013-02-19T15:32:42.650 回答
1

来自 html5 规范的第 8.2 节

http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html

虽然本规范中描述的 HTML 语法与 SGML 和 XML 非常相似,但它是一种具有自己解析规则的独立语言。

一些早期版本的 HTML(特别是从 HTML2 到 HTML4)基于 SGML 并使用 SGML 解析规则。然而,很少(如果有的话)Web 浏览器实现了对 HTML 文档的真正 SGML 解析;历史上,唯一将 HTML 作为 SGML 应用程序严格处理的用户代理是验证器。由此产生的混乱——验证器声称文档具有一种表示,而广泛部署的 Web 浏览器可互操作地实现不同的表示——浪费了数十年的生产力。因此,这个版本的 HTML 返回到非 SGML 基础。

鼓励有兴趣在其创作管道中使用 SGML 工具的作者使用 XML 工具和 HTML 的 XML 序列化。

因此,除非您正在编写 xml 格式的 html5,否则您不能使用 XSD 来验证 html5。

于 2013-06-05T17:54:46.957 回答