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

113

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

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

Le copy-namespacesne devrait pas être nécessaire puisque la valeur par défaut est « oui » de toute façon, mais je l' ai ajouté pour éviter des questions quant à savoir si oui ou non je l' ai essayé.

Les fichiers sont copiés dans le HTML, mais tous les éléments d'espacement de noms sont arrosés. 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

On dirait ceci 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 noms xlink manquant sur la hrefvaleur de l'élément image est particulièrement problématique.

Des idées sur la façon dont je peux faire cela 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>
jrhooker
la source
5
Votre feuille de style a-t-elle tous les espaces de noms déclarés dans la balise racine?
PhillyNJ
6
L'espace de noms SVG est-il bien formé? Le fragment que vous affichez n'inclut pas de liaison pour le préfixe «xlink».
CM Sperberg-McQueen
3
Quel processeur XSLT 2.0 utilisez-vous? Pouvez-vous poster des échantillons minimaux mais complets nous permettant de reproduire le problème? Quelle méthode de sortie XSLT utilisez-vous?
Martin Honnen
15
À première vue, cela ressemble à un bogue dans votre processeur XSLT. Mais mes soupçons sont éveillés lorsque vous dites que vous le copiez dans un document HTML. Si vous l'ajoutez à un DOM HTML, alors le DOM HTML n'est pas compatible avec les espaces de noms, donc toutes sortes de choses peuvent se produire. Cependant, votre titre dit "xHTML". Je pense donc que nous devons en savoir plus: quel processeur XSLT utilisez-vous et comment l'exécutez-vous?
Michael Kay
1
Pourriez-vous partager votre code et votre implémentation? Je suis curieux de reproduire au moins cela.
Gerard van Helden

Réponses:

1

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

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

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

Le plus ancien des logiciels
la source