Использование функции copy-of с document () для добавления SVG в вывод XHTML

113

При обработке своего XML я пытаюсь скопировать файл SVG, на который ссылается hrefатрибут, непосредственно в выходной HTML-код со следующей строкой:

 <xsl:copy-of copy-namespaces="yes" select="document(@href)"/>

В этом copy-namespacesнет необходимости, так как значение по умолчанию в любом случае - «да», но я добавил его, чтобы не возникло вопросов о том, пробовал ли я это или нет.

Файлы копируются в HTML, но любые элементы пространства имен закрываются. Например, файл, который до копирования выглядит так:

  <rdf:RDF>
      <cc:Work rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
        <dc:title/>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g transform="translate(-519.21143,-667.79077)" id="layer1">
    <image xlink:href="data:image/png;base64

Потом выглядит так:

  <_0:RDF xmlns:_0="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <_0:Work xmlns:_0="http://creativecommons.org/ns#" about="">
        <_0:format xmlns:_0="http://purl.org/dc/elements/1.1/">image/svg+xml</_0:format>
        <_0:type xmlns:_0="http://purl.org/dc/elements/1.1/" resource="http://purl.org/dc/dcmitype/StillImage"/>
        <_0:title xmlns:_0="http://purl.org/dc/elements/1.1/"/>
      </_0:Work>
    </_0:RDF>
  </metadata>
  <g id="layer1" transform="translate(-519.21143,-667.79077)">
    <image href="data:image/png;base64

Отсутствие пространства имен xlink в hrefзначении элемента изображения особенно проблематично.

Есть мысли о том, как я могу сделать это по-другому, чтобы читать в файле SVG без какой-либо интерпретации?

Я нашел одно решение, которое "работает", но это хитрость, и мне бы хотелось чего-нибудь более элегантного:

<xsl:template name="topic-image-svg">
    <!-- Generate tags to embed SWFs -->
    <xsl:element name="div">
      <xsl:if test="@width">
        <xsl:attribute name="width">
          <xsl:value-of select="@width"/>
        </xsl:attribute>
      </xsl:if>
      <xsl:if test="@height">
        <xsl:attribute name="height">
          <xsl:value-of select="@height"/>
        </xsl:attribute>
      </xsl:if>     
        <xsl:apply-templates select="document(@href)" mode="svg"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="*" mode="svg">
    <xsl:copy copy-namespaces="yes">
      <xsl:for-each select="@*">
        <xsl:choose>
          <xsl:when test="self::node()[name() = 'xlink:href']">
            <xsl:attribute name="xlink:href"><xsl:value-of select="."></xsl:value-of></xsl:attribute>
          </xsl:when>
          <xsl:otherwise>
            <xsl:copy></xsl:copy>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
     <xsl:apply-templates mode="svg"></xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
шутник
источник
5
Есть ли в вашей таблице стилей все пространства имен, объявленные в корневом теге?
PhillyNJ
6
Правильно ли сформировано пространство имен SVG? Показанный вами фрагмент не включает привязку для префикса «xlink».
CM Sperberg-McQueen
3
Какой процессор XSLT 2.0 вы используете? Можете ли вы опубликовать минимальные, но полные образцы, которые позволят нам воспроизвести проблему? Какой метод вывода XSLT вы используете?
Мартин Хоннен
15
На первый взгляд это похоже на ошибку в вашем XSLT-процессоре. Но мои подозрения возникают, когда вы говорите, что копируете его в документ HTML. Если вы добавляете его в HTML DOM, тогда HTML DOM не является дружественным к пространству имен, поэтому могут произойти всевозможные вещи. Однако в вашем заголовке написано «xHTML». Итак, я думаю, нам нужно знать больше: какой XSLT-процессор вы используете и как вы его используете?
Майкл Кей
1
Не могли бы вы поделиться своим кодом и реализацией? Мне любопытно хотя бы воспроизвести это.
Джерард ван Хелден

Ответы:

1

Думаю, вы нашли причину этой операции XSLT:

http://www.w3schools.com/xsl/el_namespace-alias.asp

что оставляет ваши искаженные пространства имен нетронутыми до тех пор, пока не будет сгенерирован вывод, когда преобразование пространства имен будет выполнено.

Старейший программист
источник