Domanda

Ho visto diverse domande su come codificare un file immagine in base64, ma che ne dici del contrario: come ricostituire un'immagine da una stringa base64 memorizzata in un file 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>

Dato il nodo XML sopra resource, come faccio a creare clip_image001.gif?

Per favore suggerisci:

  1. I processori e/o le estensioni XSLT consentono questo, inoltre
  2. Un campione XSLT che innesca la conversione

Tieni presente che deve essere in grado di gestire almeno i formati di file GIF e PNG.Preferibilmente non limitato a nessun sistema operativo.


Soluzione implementata

Basato intorno Di Mads Hansen soluzione.La differenza principale è che ho fatto riferimento net.sf.saxon.value.Base64BinaryValue direttamente nel mio spazio dei nomi anziché utilizzare il file saxon namespace, perché ho compreso le API Java in modo più intuitivo rispetto alle descrizioni del sito Web Saxonica base64Binary-to-octets E base64Binary funzioni.

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

PSVedere domanda tra fratelli per la mia implementazione su come ottenere gli hash necessari per identificare i file immagine.


Questa domanda è una sottodomanda di un'altra domanda che ho fatto in precedenza.

È stato utile?

Soluzione

Ho trovato questa voce negli elenchi di posta XSL che descrive come utilizzare il file Funzione di estensione sassone xs:base64Da binario a ottetto per trasmetterlo in un file utilizzando Java FileOutputStream in un foglio di stile XSLT 2.0:

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

Altri suggerimenti

I seguenti lavori:

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

Trasformalo in HTML.

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

È disponibile un metodo migliore a partire da Saxon 9.5 tramite il modulo di estensione EXPath File (disponibile in Saxon-PE e Saxon-EE).

Ecco un frammento del codice che sto utilizzando per estrarre file di immagine binari da documenti Word (l'XML di origine è in formato 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top