Usar copy-of con document () para agregar SVG a la salida XHTML

113

Mientras proceso mi XML, intento copiar un archivo SVG al que se hace referencia desde un hrefatributo directamente en mi HTML de salida con la siguiente línea:

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

No copy-namespacesdebería ser necesario ya que el valor predeterminado es "sí" de todos modos, pero lo agregué para evitar preguntas sobre si lo he probado o no.

Los archivos se copian en HTML, pero los elementos con espacios de nombres se almacenan. Por ejemplo, un archivo que tiene este aspecto antes de ser copiado:

  <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

Se ve así después:

  <_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

El espacio de nombres xlink que falta en el hrefvalor del elemento de imagen es particularmente problemático.

¿Alguna idea sobre cómo puedo hacer esto de manera diferente para leer en el archivo SVG sin ninguna interpretación?

Encontré una solución que "funciona", pero es un truco y me gustaría algo más elegante:

<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>
joker
fuente
5
¿Su hoja de estilo tiene todos los espacios de nombres declarados en la etiqueta raíz?
PhillyNJ
6
¿El espacio de nombres SVG está bien formado? El fragmento que muestra no incluye un enlace para el prefijo 'xlink'.
CM Sperberg-McQueen
3
¿Qué procesador XSLT 2.0 usas? ¿Puede publicar muestras mínimas pero completas que nos permitan reproducir el problema? ¿Qué método de salida XSLT usas?
Martin Honnen
15
A primera vista, parece un error en su procesador XSLT. Pero mis sospechas se despiertan cuando dices que lo estás copiando en un documento HTML. Si lo agrega a un DOM HTML, entonces el DOM HTML no es compatible con el espacio de nombres, por lo que pueden suceder todo tipo de cosas. Sin embargo, su título dice "xHTML". Así que creo que necesitamos saber más: ¿qué procesador XSLT estás usando y cómo lo estás ejecutando?
Michael Kay
1
¿Le importaría compartir su código e implementación? Tengo curiosidad por al menos reproducir esto.
Gerard van Helden

Respuestas:

1

Creo que ha dado con el motivo de esta operación XSLT:

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

lo que deja intactos los espacios de nombres destrozados hasta que se genera la salida, cuando se realiza la transformación del espacio de nombres.

El chico de software más viejo
fuente