2009-11-06 29 views
7

He visto varias preguntas sobre cómo codificar un archivo de imagen en base64, pero ¿qué hay al revés - cómo puedo reconstituir una imagen desde una cadena base64 almacenada en un archivo XML?XSLT: Convierta datos base64 en archivos de imagen

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

Dado el nodo XML anterior resource, ¿cómo hago para crear clip_image001.gif?

Para sugerir:

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

Tenga en cuenta que debe ser capaz de manejar al menos GIF & formatos de archivo PNG. Preferiblemente no restringido a ningún SO.


solución implementada

base alrededor de Mads Hansen's solución. La principal diferencia es que hice referencia a net.sf.saxon.value.Base64BinaryValue directamente en mi espacio de nombres en lugar de usar el espacio de nombres saxon, porque entendí las API de Java de manera más intuitiva que las descripciones de las funcionesy base64Binary del sitio web de 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. Vea sibling question para mi implementación de cómo obtener los hashes necesarios para identificar los archivos de imagen.


Esta pregunta es una sub pregunta de another question I have asked previously.

Respuesta

9

I found this entry from the XSL maiing lists que describe cómo utilizar los sajones 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> 
+0

¡Gracias! Esto es lo que quería, porque en realidad está escribiendo las imágenes en archivos externos. – bguiz

+0

Creo que debería ser 'saxon: base64Binary-to-octets' (con el' s' posterior). Ver http://www.saxonica.com/documentation/extensions/functions.html –

+0

Gracias, Jackem. He corregido la muestra del código. –

1

Transform it to HTML.

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

Qué procesador XSLT y extensiones se utilizan? – bguiz

+0

Y quiero ser capaz de generar realmente los archivos de imagen, es decir, crear clip_image001.gif, y luego en la salida html obtener , porque también necesito generar un hash del archivo de imagen. – bguiz

6

las siguientes obras:

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

+1 @StrangeDays: ¡gracias por su respuesta! No voy a analizar esto (fue hace mucho tiempo) en el corto plazo, pero si de hecho funciona, parece una solución mucho más ordenada y elegante que las otras sugeridas aquí hasta ahora. – bguiz

+0

se olvidó un espacio allí: Steven

+0

Esto es para generar elemento HTML IMG con fuente BASE64. No es exactamente una respuesta a la pregunta. –

0

hay una mejor metho d disponible desde Saxon 9.5 a través del módulo de extensión EXPath File (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> 
Cuestiones relacionadas