Question

Je l'ai vu plusieurs questions sur la façon de coder un fichier image en base64, mais que diriez-vous dans l'autre sens - comment puis-je reconstitue une image à partir d'une chaîne de base64 stockée dans un fichier XML

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

Compte tenu du noeud XML ci-dessus resource, comment puis-je faire pour créer clip_image001.gif?

S'il vous plaît indiquer:

  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 et formats de fichiers PNG. De préférence, ne se limite pas à un système d'exploitation.


solution mise en oeuvre

Basé sur la solution Mads Hansen. La principale différence étant que j'ai parlé net.sf.saxon.value.Base64BinaryValue directement dans mon espace de noms plutôt que d'utiliser l'espace de noms saxon, parce que je compris les API Java de manière plus intuitive que les descriptions du site Saxonica des fonctions de 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 frères et soeurs question pour ma mise en œuvre de la façon d'obtenir les hash nécessaires pour identifier les fichiers images.


Cette question est une sous-question de une autre question que j'ai demandé précédemment .

Était-ce utile?

La solution

J'ai trouvé cette entrée dans les listes maiing XSL qui décrit comment utiliser les fonction d'extension saxonne xs: base64Binary à octet pour le diffuser dans 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>

Autres conseils

Les travaux suivants:

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

Transformer en HTML.

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

Il y a une meilleure méthode disponible depuis Saxon 9.5 via le module d'extension de fichier EXPath (disponible à Saxon-PE et Saxon-EE).

Voici un fragment de code que je utilise pour extraire les fichiers d'images binaires à partir de 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top