我生成如下的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进行验证?
答案 0 :(得分:1)
假设您正在根据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
运行时,在本地缓存了SVG DTD的Ubuntu计算机上会产生不相关的警告,与通过http获取DTD相比,xmllint
的快速响应就证明了这一点。 (这还会对我产生其他警告)。