我生成如下SVG svg xmlns="http://www.w3.org/2000/svg" xmlns:foobar="http://foobar.com"path d="..." foobar:foo="bar"//svg 如果没有自定义属性foo(以及命名空间foobar),整个SVG将对DTD进行验证.显然,我使用自定义命名
<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的快速响应证明了这一点(这会导致其他警告我).