【问题标题】:Validate SVG with custom namespace against DTD针对 DTD 使用自定义命名空间验证 SVG
【发布时间】:2018-09-04 04:09:00
【问题描述】:

我生成如下所示的 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=... 的声明开始,它本身不是 @987654327 的元素@。我的声明错了吗?使用自定义命名空间/属性时甚至可以根据 DTD 进行验证吗?

【问题讨论】:

    标签: xml svg dtd


    【解决方案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 运行该文档时,会在我的 Ubuntu 机器上产生不相关的警告,其中 SVG DTD 在本地缓存,xmllint 与通过 http 获取 DTD 相比的快速响应证明了这一点(这会导致对我的其他警告)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      相关资源
      最近更新 更多