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

use*_*968 5 xml svg dtd

我生成如下 SVG

<svg xmlns="http://www.w3.org/2000/svg" xmlns:foobar="http://foobar.com">
<path d="..." foobar:foo="bar"/>
</svg>
Run Code Online (Sandbox Code Playgroud)

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

imh*_*tap 2

假设您正在根据 SVG 1.1 第二版进行验证。DTD 的官方 URL 如下所示,您可以通过重新定义(“抢占”)参数实体的默认空字符串值来利用 SVG DTD 的广泛自定义功能,SVG.External.attrib以便它包含自定义的属性列表声明片段属性(加上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>
Run Code Online (Sandbox Code Playgroud)

SVG.External.attribSVG DTD 最终扩展了SVG 元素的单独声明中的替换文本。根据您的目的,可能有更合适的参数实体可以自定义/覆盖,例如SVG.Core.extra.attrib.

请注意,该文档在运行时xmllint --valid --loaddtd会在我的 Ubuntu 计算机上产生不相关的警告,其中 SVG DTD 本地缓存,xmllint与通过 http 获取 DTD 相比(这会给我带来其他警告)相比,它的快速响应就证明了这一点。