3

我正在使用 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 编译位中也会失败。

这是 XSD 文件。这是一个简单的测试文档:

 <?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(相对于另一个站点),因为最终这是关于理解 XML 规范和依赖项以编写和验证文档。我欢迎做正确事情的代码片段,不管是什么正确的事情。

想法?谢谢。

4

1 回答 1

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.xsdURL 粘贴到浏览器中,一段时间后(或不,这取决于这些链接被限制),您应该会看到xml.xsd - 在您的情况下缺少的部分;如果您看到的是 HTML 而不是普通的 XML,请切换到源代码视图来查看它,这意味着 ../2008/09/xsd.xsl 样式表已由您的浏览器自动应用。

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

这种导入最有可能作为一种安全措施被“悬空”,以确保人们不会因为被认为是众所周知的 XSD 而一遍又一遍地访问 W3C 站点。期望(至少从我过去看到的情况来看)是 XSD 处理器自动将这些众所周知的命名空间引用解析为这些 XSD 的某种本地/嵌入式副本。显然,您尝试过的处理器默认情况下不会这样做。

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

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

于 2013-03-13T04:17:22.847 回答