【发布时间】:2018-02-08 20:50:10
【问题描述】:
背景
一些资源讨论了在 SVG 文档中使用变量,包括:
- Variables in SVG: Is it possible?
- SVG variable text
- How do I define or reference a variable in SVG?
- SVG: About using <defs> and <use> with variable text values
- http://www.schepers.cc/w3c/svg/params/ref.html
- https://www.w3.org/TR/2009/WD-SVGParamPrimer-20090430/#Introduction
虽然基于 CSS、JavaScript 和 HTML 的解决方案非常适合 Web,但在其他情况下 SVG 也很有用,并且能够为变量定义外部源同样方便。
问题
SVG 不提供一种机制来定义 SVG 相关的软件包(例如 Inkscape 和 rsvg-convert)可以重用的可重用文本。例如,以下将是极好的:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg ...>
<input href="definitions.svg" />
...
<text ...>${variableName}</text>
</svg>
image element 可以重载以导入外部文件,但它是 hackish 并且不允许将文本值分配给变量名以供重复使用。
问题
您将如何从服务器上的外部文件(例如,YAML 文件,但也可以是数据库)读取变量名称和值,并在渲染之前替换 SVG 文件中的这些变量?
【问题讨论】:
-
正确的 XML 解决方案是使用 XSLT 来执行替换。从 YAML 创建 XSLT 模板听起来有点令人生畏,但至少你应该涵盖所有奇怪的极端情况。
-
使用 XSLT 将 XML 转换为 YAML 是 straightforward。通过可应用于文本节点和属性值的 XSLT 将 YAML 转码为 XML 字典需要大量工作。即使是 expanding 和 tool chain 从 YAML 转换为 XML 也需要额外的数据转换步骤,而使用简单的字符串替换可以避免这一步骤。如果有一个解决方案可以将 YAML 读入 XSLT 并且不需要花费数小时来实现,请告诉。
标签: linux bash svg yaml string-interpolation