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

时间:2018-08-30 11:26:56

标签: xml svg dtd

我生成如下的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进行验证?

1 个答案:

答案 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的快速响应就证明了这一点。 (这还会对我产生其他警告)。