Pregunta

He visto a varias preguntas sobre cómo codificar un archivo de imagen en la base 64, pero, ¿y al revés -? ¿Cómo reconstituir una imagen de una cadena de base 64 se almacena en un archivo 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>

Por todo lo expuesto XML nodo resource, ¿cómo hago para crear clip_image001.gif?

Para sugerir:

  1. procesadores y / o extensiones de XSLT permiten esto, además
  2. una muestra de XSLT que desencadena la conversión

Tenga en cuenta que debe ser capaz de manejar al menos GIF y PNG formatos de archivo. Preferiblemente no se limita a cualquier sistema operativo.


solución implementada

Basada en solución Mads de Hansen. La principal diferencia es que hice referencia net.sf.saxon.value.Base64BinaryValue directamente en mi espacio de nombres en lugar de utilizar el espacio de nombres saxon, porque comprendía las API de Java de forma más intuitiva que las descripciones de las funciones y base64Binary-to-octets base64Binary del sitio web Saxonica.

<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. Ver hermano pregunta para mi puesta en práctica de cómo obtener los hashes necesarias para identificar los archivos de imagen.


Esta pregunta es una subpregunta de otra pregunta que he hecho anteriormente .

¿Fue útil?

Solución

encontré esta entrada de la lista de maiing XSL que describe cómo utilizar los Saxon función de extensión xs: base64Binary-a-octeto se debe transmitir a un archivo utilizando el Java FileOutputStream en un XSLT 2.0 hoja de estilo:

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

Otros consejos

Las siguientes obras:

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

Transformar a HTML.

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

Hay una mejor método disponible desde Saxon 9.5 a través del módulo de extensión EXPath de archivos (disponible en Saxon-PE y Saxon-EE).

Aquí es un fragmento de código que estoy usando para extraer los archivos de imagen binaria de documentos de Word (XML de origen está en 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top