0

我想将来自不同源文档的几个 SVG 片段组合成一个结果文档。为了避免 ID 冲突,我必须通过在每个源文档的 ID 前面加上一个唯一的字符串来“命名空间”它们。

我可以使用 XPath 来查找 SVG 文档中的所有 ID 声明(例如//@id)。我可以通过直接操作 DOM 或执行一些正则表达式魔法(或两者的组合)来替换 ID。附带说明:我正在使用 PHP 完成所有这些工作,速度/性能并不重要,因此正则表达式替换就可以了。

到目前为止,我将任何具有本地名称的属性id视为 ID 声明,例如

<clipPath id="a">...</clipPath>

并且我成功地替换了这种语法的相应 IDREF(即,当前面有 a 时#):

<g clip-path="url(#a)">...</g>

现在这些是我的问题:

  1. id除了本地名称也是 ID 声明的属性之外,SVG 中是否还有其他属性?哪个?
  2. 除了上述(前面)之外,SVG 中是否还有其他 IDREF 语法#?哪个?
  3. 我应该知道关于 SVG 中的 ID / IDREF 的任何资源吗?
  4. 合并 SVG 文档时除了重复 ID 之外是否还有其他潜在冲突?

感谢您的任何提示!:)

4

1 回答 1

1
  1. 理论上,可以说任何一个特定属性都是带有 DOCTYPE 声明的 ID 类型。请参阅XML 规范。但是,每个元素只允许一个 ID 属性(有效性约束)。无论如何,如果您确实向 SVG 添加了自定义 ID 属性,我认为它不再是真正的 SVG 内容。

    另一种可能性是xml:id,这是不鼓励的。请参阅SVG Tiny 1.2

  2. 你什么意思?里面的语法url(...)是一个IRI,所以它可以是例如http://example.com/example.svg#foo。它通常只是一个片段,但并非总是如此。

  3. svg 规范、xml规范和xml:id规范的链接章节

  4. 某些 CSS 选择器可能仅适用于一个特定的 svg 文档(视情况而定)。如果您在合并两个文档时更改了 id,那么样式表可能也需要更新以考虑到这一点。

于 2013-08-20T12:39:25.167 回答