2013-08-01 32 views
0

我想將來自不同源文檔的幾個SVG片段組合成一個結果文檔。爲了避免ID衝突,我必須通過爲每個源文檔的ID添加一個唯一字符串來「命名空間」。在SVG文檔中使用ID/IDREFs

我可以使用XPath來查找SVG文檔中的所有ID聲明(例如//@id)。我可以通過直接操作DOM或通過執行一些正則表達式wizardry(或兩者的組合)來替換ID。 作爲一個方面說明:我正在用PHP做這一切,速度/性能並不重要,所以正則表達式替換就好了。

到目前爲止,我將任何屬性都以本地名稱id作爲ID聲明處理,例如,

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

和我(當被# preceeded IE)替換該語法對應IDREF的成功:

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

現在,這些是我的問題:

  1. 是否有任何SVG中除本地名稱爲id之外的其他屬性也是ID聲明?哪個?
  2. SVG中除了上述之外還有其他語法的IDREFs嗎(前#)?哪個?
  3. 是否有關於SVG中ID/IDREF的任何資源我應該知道的?
  4. 合併SVG文檔時是否存在重複ID以外的任何潛在衝突?

感謝您的任何提示! :)

回答

1
  1. 理論上它可以說任何一個特定屬性的類型爲ID的使用DOCTYPE聲明。請參閱XML specification。但是,每個元素只允許有一個ID屬性(有效性約束)。無論如何,如果你確實爲SVG添加了一個自定義ID屬性,我會認爲它不再是真正的SVG內容。其他可能性是xml:id,這是不鼓勵的。見SVG Tiny 1.2

  2. 你是什麼意思? url(...)中的語法是IRI,因此它可以是例如http://example.com/example.svg#foo。它通常只是一個片段,但並非總是如此。

  3. linking chapter的svg規範,xml規範和xml:id規範。

  4. 某些CSS選擇器可能只能在一個特定的svg文檔中工作(具體取決於)。如果在合併兩個文檔時更改ID,則可能還需要更新樣式表,以便將其考慮在內。

+0

2.您還需要處理'xlink:href'引用,如在''和其他元素中找到。例如,請參閱:http://www.w3.org/TR/SVG/struct。html#ImageElement –

+0

感謝@Erik的回答,這肯定涵蓋了一些有趣的觀點,但是對於我的具體問題,部分看起來有點像一般的XML講座。因此,請允許我重新說明:除引用的SVG文檔之外,是否還有其他ID-IDREF參考模式([id/xml:id attribute])(http://www.w3.org/ TR/SVGTiny12/struct.html#IDAttribute)+ IRI引用(如果引用同一個文檔,後者只是相關的),而不是CSS選擇器),它們在合併幾個SVG文檔時可能是相關的?謝謝! –

+0

你是對的,@BigBadaboom,'xlink:href'屬性也帶有IRI引用,所以這些都是相關的,以及只要它們引用同一個文檔。感謝提示! –