【问题标题】:Java HTML 5 validation with XSD / trang HTML 5 Relax NG to XSD conversion使用 XSD 进行 Java HTML 5 验证 / trang HTML 5 Relax NG 到 XSD 转换
【发布时间】: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


【解决方案1】:

来自 html5 规范的第 8.2 节

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

虽然本规范中描述的 HTML 语法很接近 类似于 SGML 和 XML,它是一种独立的语言 解析规则。

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

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

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

【讨论】:

    【解决方案2】:

    Web 中似乎有一些 XHTML 5 XSD。例如,在 http://www.xmlmind.com/xmleditor/download.shtml

    上有一个开源 XHTML 5 Schema

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2012-04-13
      相关资源
      最近更新 更多