我生成如下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的元素.我的声明有误吗?甚至可以在使用自定义命名空间/属性时验证DTD吗?
最佳答案 假设您正在验证SVG 1.1第二版. DTD在其官方URL下面显示,您可以通过重新定义(“抢占”)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的替换文本.根据您的目的,可能有更合适的参数实体来自定义/覆盖,例如SVG.Core.extra.attrib.
请注意,当通过xmllint –valid –loaddtd运行时,该文档会在我的Ubuntu机器上生成无关警告,其中SVG DTD在本地缓存,与通过http获取DTD相比,xmllint的快速响应证明了这一点(这会导致其他警告我).