2009-11-06 4 views
7

J'ai vu plusieurs questions sur la façon d'encoder un fichier image dans base64, mais qu'en est-il de l'inverse - comment reconstituer une image à partir d'une chaîne base64 stockée dans un fichier XML?XSLT: Convertir les données de base64 en fichiers image

<resource> 
<data encoding="base64"> 
R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC 
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku 
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8 
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d 
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw== 
</data> 
<mime>image/gif</mime> 
<resource-attributes> 
    <file-name>clip_image001.gif</file-name> 
</resource-attributes> 
</resource> 

Étant donné le noeud XML ci-dessus resource, comment puis-je faire pour créer clip_image001.gif?

S'il vous plaît suggérer:

  1. processeurs XSLT et/ou extensions permettent cela, plus
  2. un XSLT exemple qui déclenche la conversion

Notez qu'il doit être capable de gérer au moins GIF & Formats de fichier PNG. De préférence non limité à tout système d'exploitation.


solution mise en œuvre

Basé autour de la solution Mads Hansen's. La principale différence étant que j'ai référencé net.sf.saxon.value.Base64BinaryValue directement dans mon espace de noms plutôt que d'utiliser l'espace de noms saxon, parce que j'ai mieux compris les API Java que les descriptions du site Web Saxonica des fonctions base64Binary-to-octets et base64Binary.

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:b64="net.sf.saxon.value.Base64BinaryValue" 
    xmlns:fos="java.io.FileOutputStream" 
    ... 
    exclude-result-prefixes="b64 fos"> 
... 
<xsl:for-each select="resource">     
    <xsl:variable name="b64" select="b64:new(string(data))"/> 
    ... 
    <xsl:variable name="fos" select="fos:new(string($img))"/> 
    <xsl:value-of select="fos:write($fos, b64:getBinaryValue($b64))"/> 
    <xsl:value-of select="fos:close($fos)"/> 
</xsl:for-each> 
... 

P.S. Voir sibling question pour ma mise en œuvre de la façon d'obtenir les hachages nécessaires pour identifier les fichiers d'image.


Cette question est une sous-question de another question I have asked previously.

Répondre

9

I found this entry from the XSL maiing lists qui décrit comment utiliser la fonction d'extension saxonne xs: base64Binary à octet pour le diffuser vers un fichier en utilisant Java FileOutputStream dans un XSLT 2.0 stylesheet:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
xmlns:saxon="http://saxon.sf.net/"; 
xmlns:fos="java.io.FileOutputStream"> 
<xsl:template match="/"> 
    <xsl:variable name="img" select="concat('c:\test\jesper', '.jpg')"/> 
    <xsl:variable name="fos" select="fos:new(string($img))"/> 
    <xsl:value-of select="fos:write($fos, 
saxon:base64Binary-to-octets(xs:base64Binary(my-base64-encoded-image)))"/> 
    <xsl:value-of select="fos:close($fos)"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

Merci! C'est ce que je voulais, car il est en train d'écrire les images dans des fichiers externes. – bguiz

+0

Je pense qu'il devrait être 'saxon: base64Binary-to-octets' (avec le' s'). Voir http://www.saxonica.com/documentation/extensions/functions.html –

+0

Merci, Jackem. J'ai corrigé l'exemple de code. –

1

Transformez-le en HTML.

<img src="data:{mime};base64,{data}" /> 
+0

Qu'est-ce que le processeur XSLT et extensions utilisez-vous? – bguiz

+0

Et je veux être en mesure de générer réellement les fichiers image, c'est créer clip_image001.gif, puis dans la sortie html obtenir , parce que j'ai besoin de générer un hachage à partir du fichier image. – bguiz

6

Les travaux suivants:

<img> 
    <xsl:attribute name="src"> 
    <xsl:value-of select="concat('data:image/gif;base64,',xPath)"/> 
    </xsl:attribute> 
</img> 
+0

+1 @StrangeDays: Merci pour votre réponse! Je ne vais pas me pencher là-dessus (c'était il y a longtemps), mais si ça marche vraiment, ça ressemble à une solution beaucoup plus soignée et élégante que les autres proposées ici. – bguiz

+0

a oublié un espace là: Steven

+0

Ceci est de générer l'élément HTML IMG avec la source BASE64. Pas exactement une réponse à la question. –

0

Il y a une meilleure métho d disponible depuis Saxon 9.5 via le module d'extension EXPath File (disponible en Saxon-PE et Saxon-EE).

Voici un fragment de code que je utilise pour extraire les fichiers d'images binaires à partir des documents Word (XML source est au format WordProcessingML):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:file="http://expath.org/ns/file" xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"> 

<xsl:template match="/pkg:package"> 
    <xsl:apply-templates select="pkg:part/pkg:binaryData"/> 
</xsl:template> 

<xsl:template match="pkg:binaryData"> 
    <xsl:variable name="filename"> 
     <xsl:value-of select="replace(../@pkg:name, '/word/media/', '')"/> 
    </xsl:variable> 
    <xsl:variable name="path" select="concat('/some/folder/', $filename)"/> 
    <xsl:message><xsl:value-of select="$path"/></xsl:message> 

    <xsl:value-of select="file:write-binary($path, xs:base64Binary(string()))"/>  
</xsl:template> 
Questions connexes