XSL-преобразование SVG добавляет атрибут пространства имен в новый тег - PullRequest
0 голосов
/ 29 марта 2010

У меня есть файл SVG, который я хочу расширить, добавив обработчики onclick к ребрам и узлам. Я также хочу добавить тег сценария, ссылающийся на JavaScript. Проблема в том, что к тегу script добавляется пустой атрибут пространства имен. Я не нашел никакой информации по этому поводу, которую я понимаю. Почему XSLT добавляет пустое пространство имен?

XSL-файл:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:svg="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">

<xsl:output method="xml" encoding="utf-8" />

<xsl:template match="/svg:svg">
  <xsl:copy>
    <script type="text/ecmascript" xlink:href="base.js" /> <!-- this tag gets a namespace attr -->
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>

<!-- Identity transform http://www.w3.org/TR/xslt#copying -->
<xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

<!-- Check groups and add functions -->
<xsl:template match="svg:g">
  <xsl:copy>
    <xsl:if test="@class = 'node'">
      <xsl:attribute name="onclick">node_clicked()</xsl:attribute>
    </xsl:if>
    <xsl:if test="@class = 'edge'">
      <xsl:attribute name="onclick">edge_clicked()</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

1 Ответ

2 голосов
/ 29 марта 2010

Литеральный результирующий элемент без префикса script находится в пространстве имен по умолчанию, которое в данном случае не является пространством имен. В вашем итоговом документе этот элемент явно не размещен в пространстве имен через xmlns="".

Раздел 6.2 Пространства имен в XML 1.0 говорит, что:

Значение атрибута по умолчанию Объявление пространства имен МОЖЕТ быть пустым. Это имеет тот же эффект, в пределах объем декларации, там не является пространством имен по умолчанию.

Если вы хотите, чтобы это было svg:script в пространстве имен по умолчанию, установите пространство имен svg по умолчанию для вашей таблицы стилей. Вам все равно понадобится префикс пространства имен для этого пространства имен.

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns="http://www.w3.org/2000/svg">
...