在SVG文档中使用ID / IDREF

时间:2013-08-01 15:49:23

标签: xml xpath svg idref

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

我可以使用XPath查找SVG文档中的所有ID声明(例如//@id)。我可以通过直接操作DOM或通过执行一些正则表达式向导(或两者的组合)来替换ID。 作为旁注:我正在用PHP做这一切,速度/性能并不重要,所以正则表达式替换就好了。

到目前为止,我正在使用本地名称id作为ID声明处理任何属性,例如

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

我成功替换了这种语法的相应IDREF(即在#之前):

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

现在这些是我的问题:

  1. SVG中除了本地名称为id且属于ID声明的属性外,是否还有其他任何属性?哪些?
  2. 除了上面的#之外,SVG中还有其他IDREF语法吗?哪些?
  3. 我应该注意SVG中ID / IDREF的资源吗?
  4. 合并SVG文档时是否存在重复ID以外的潜在冲突?
  5. 感谢任何提示! :)

1 个答案:

答案 0 :(得分:1)

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

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

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

  3. svg规范的linking chapterxml规范和xml:id规范。

  4. 某些CSS选择器只能在一个特定的svg文档中工作(取决于)。如果在合并两个文档时更改了ids,则可能还需要更新样式表以将其考虑在内。