113 votes

Utilisation de copy-of avec document() pour ajouter des SVG à la sortie XHTML

Lors du traitement de mon XML, j'essaie de copier un fichier SVG référencé à partir d'un fichier d'archive. href directement dans mon HTML de sortie avec la ligne suivante :

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

Le site copy-namespaces ne devrait pas être nécessaire puisque la valeur par défaut est "oui" de toute façon, mais je l'ai ajouté pour éviter les questions sur le fait que je l'ai essayé ou non.

Les fichiers sont copiés dans le HTML, mais tous les éléments à espacement de noms sont détruits. Par exemple, un fichier qui ressemble à ceci avant d'être copié :

  <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

Ça ressemble à ça aprè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

L'espace de nom xlink manquant sur le href de l'élément image est particulièrement problématique.

Avez-vous une idée de la manière dont je peux procéder différemment pour lire le fichier SVG sans aucune interprétation ?

J'ai trouvé une solution qui "fonctionne", mais c'est un hack et j'aimerais quelque chose de plus élégant :

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

1voto

Je pense que vous avez trouvé la raison de cette opération XSLT :

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

qui laisse vos espaces de noms tronqués intacts jusqu'à ce que la sortie soit générée, lorsque la transformation des espaces de noms est terminée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X