我生成如下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
to失败验证,从xmlns:foobar=...
的声明开始,svg
本身不是SVG.External.attrib
的元素。我的声明有误吗?甚至可以在使用自定义命名空间/属性时验证DTD吗?
假设您正在验证SVG 1.1第二版。 DTD在其官方URL下面显示,您可以通过重新定义(“抢占”)xmlns:foobar
参数实体的默认空字符串值来利用SVG DTD的广泛自定义功能,使其包含属性列表声明片段供您使用自定义属性(加上<!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.External.attrib
SVG DTD最终在SVG元素的单个声明中扩展SVG.Core.extra.attrib
的替换文本。根据您的目的,可能有更合适的参数实体来自定义/覆盖,例如xmllint --valid --loaddtd
。
请注意,当通过xmllint
运行时,该文档会在我的Ubuntu机器上生成不相关的警告,其中SVG DTD在本地缓存,qazxswpoi的快速响应与通过http获取DTD(这会导致其他警告)相比证明了这一点。