根据 DTD 使用自定义命名空间验证 SVG

Validate SVG with custom namespace against DTD

我生成如下所示的 SVG

<svg xmlns="http://www.w3.org/2000/svg" xmlns:foobar="http://foobar.com">
<path d="..." foobar:foo="bar"/>
</svg>

没有自定义属性 foo(和命名空间 foobar),整个 SVG 将根据 DTD 进行验证。显然,我错误地使用了自定义命名空间,因为添加 foobar 命名空间和相关属性会导致 xmllint 验证失败,从 xmlns:foobar=... 的声明开始,它本身 不是 svg 的元素。我的声明有误吗?使用自定义 namespaces/attributes 时甚至可以针对 DTD 进行验证吗?

假设您要根据 SVG 1.1 第 2 版进行验证。 DTD 的官方 URL 如下所示,您可以通过重新定义 ("preempting") SVG.External.attrib 参数实体的默认空字符串值来利用 SVG DTD 的广泛自定义功能这样它就包含自定义属性的属性列表声明片段(加上 xmlns:foobar 声明):

<!DOCTYPE svg
  SYSTEM "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
  <!ENTITY % SVG.External.attrib
    "xmlns:foobar CDATA #IMPLIED
     foobar:foo CDATA #IMPLIED">
]>
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:foobar="http://foobar.com">
  <path d="M 0 0 z" foobar:foo="bar"/>
</svg>

SVG DTD 最终在 SVG 元素的单独声明中扩展 SVG.External.attrib 的替换文本。根据您的目的,customize/overwrite 可能有更合适的参数实体,例如 SVG.Core.extra.attrib.

请注意文档,当 运行 到 xmllint --valid --loaddtd 时,会在我的 Ubuntu 机器上产生不相关的警告,其中 SVG DTD 被本地缓存,xmllint'与通过 http 获取 DTD(这会给我带来其他警告)相比,它的响应速度更快。