无法编译W3C提供的XSD架构;无法解决“id”?

时间:2013-03-12 22:28:49

标签: xml xsd xml-validation inkml

我正在使用XML架构并尝试生成一个使用它的简单有效文档。

架构XSD由W3C提供,所以我无法想象它实际上有什么问题。但命令行上的xmllint以及任意数量的免费在线验证器都抱怨实际的XSD(不是我的测试文档):

The QName value '{http://www.w3.org/XML/1998/namespace}id' does not resolve to a(n) attribute declaration.

请注意,它无法解析id类型/名称,这是基本的XML内容。我不是XML大师,所以我可能会遗漏一些关于命名空间/链接的明显信息。这对我的测试文档来说不是问题,因为即使是一个简单的测试文档也会在XSD编译位中失败。

Here's the XSD file。这是一个简单的测试文档:

 <?xml version="1.0" encoding="UTF-8"?>
 <ink xmlns="http://www.w3.org/2003/InkML" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.w3.org/TR/2011/REC-InkML-20110920/inkml.xsd">
 </ink>

但是尽可能地尝试,我不能让xmllint或任何在线验证器甚至超过XSD解析/编译阶段,因为XML id类型在某种程度上是不可靠的。

我对XML的理解是不正确的吗?我问SO(vs另一个站点),因为最终这是关于理解XML规范和依赖关系来编写和验证文档。无论正确的事情是什么,我都会欢迎能做正确事情的代码片段。

思考?感谢。

1 个答案:

答案 0 :(得分:4)

您指向的模式包含对众所周知的XML模式的导入语句。

<xsd:import namespace="http://www.w3.org/XML/1998/namespace" id="xml" />
<!-- schemaLocation="http://www.w3.org/2001/xml.xsd" -->

正如您所看到的,与下面的另一个不同......

<xsd:import namespace="http://www.w3.org/1998/Math/MathML" schemaLocation="inkml-mathml2-subset.xsd" id="mathml" />

前者没有为您提供schemaLocation属性。

如果您将http://www.w3.org/2001/xml.xsd网址粘贴到浏览器中,过了一段时间(或者不是,这取决于这些链接会受到限制),您应该会看到 xml.xsd - 在你的情况下缺少一块;如果您看到HTML而不是纯XML,请切换到源视图以查看它,这意味着您的浏览器会自动应用../2008/09/xsd.xsl样式表。

我确信如果您现在修改第一个导入以包含 schemaLocation 属性,那么大多数验证器现在应该可以正常工作。

此导入保留&#34;悬空&#34;最有可能作为一种安全措施,确保人们不会一次又一次地击中W3C网站以获得众所周知的XSD。期望(至少从我以前看到的)是XSD处理器自动解析这些对这些XSD的某种本地/嵌入式副本的众所周知的命名空间引用。显然,您尝试过的处理器默认情况下不会这样做。

QTAssistant(我与它相关联)确实解决了它,所以如果你在本地下载这两个XSD然后按原样加载它们,那么每个XSD都可以正常验证。

如果您不想修改XSD,例如:当您真的想从远程URL加载XSD时,解决方案是向XSD处理器提供某种目录信息,以帮助它解决 xml.xsd 。对于xmllint,请使用--catalogs选项。我建议使用 xml.xsd 的本地副本。浏览系统上可能已有的目录(如果设置,则为$ SGML_CATALOG_FILES,否则为/ etc / xml / catalog),也许您已经可以使用现有目录。