Дальнейшее расследование
Я создал тестовый файл SVG на моем сервере , который:
- Имеет
<image>
с атрибутом href
с правильно заданным пространством имен.
- Использует JS для создания нового
<image>
, используя setAttributeNS(xlinkNS,'xlink:href',…)
- Использует JS для создания нового
<image>
, используя setAttributeNS(xlinkNS,'href',…)
- Использует JS для клонирования исходного (действительного)
<image>
элемента.
- Наконец, сериализует XML и записывает результат.
Результаты в WebKit
Инструменты разработчика Safari и Chrome отображают DOM как:
<image xlink:href="…" />
<image xlink:href="…" />
<image href="…" />
<image xlink:href="…" />
Однако, сериализация XML, записанная на консоль (что вы также получите, если щелкнете правой кнопкой мыши по Элементу и скажете «Копировать как HTML»), показывает это:
<image xlink:href="…" />
<image xlink:href="…" />
<image href="…" xmlns="http://www.w3.org/1999/xlink" />
<image xlink:href="…" />
Результаты в Firefox
Firebug также показывает это для сгенерированного DOM:
<image xlink:href="…" />
<image xlink:href="…" />
<image href="…" />
<image xlink:href="…" />
Однако консоль Firebug показывает разумную (ожидаемую) сериализацию:
<image xlink:href="…" />
<image xlink:href="…" />
<image xlink:href="…" />
<image xlink:href="…" />
Дальнейшие исследования показывают, что даже если вы используете код, подобный:
img.setAttributeNS(xlinkNS,'GLARBLE:href',…);
Firebug покажет «GLARBLE: href» в качестве имени атрибута, но сериализация XML использует URI для пространства имен, находит соответствующее пространство имен в корневом элементе <svg>
и правильно выдает:
<image xlink:href="…" />
Заключение
Похоже, что XML-сериализация, выполняемая Webkit, некорректна при использовании setAttributeNS
для создания атрибута пространства имен без префикса пространства имен для имени атрибута.
Однако, если вы предоставите префикс пространства имен для имени атрибута, совпадающего с префиксом пространства имен, уже объявленным в вашем документе, сериализация будет работать правильно.