使用针对DTD的自定义命名空间验证SVG

问题描述 投票:4回答:1

我生成如下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命名空间和相关属性导致xmllintto失败验证,从xmlns:foobar=...的声明开始,svg本身不是SVG.External.attrib的元素。我的声明有误吗?甚至可以在使用自定义命名空间/属性时验证DTD吗?

xml svg dtd
1个回答
1
投票

假设您正在验证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(这会导致其他警告)相比证明了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.