2009-11-06 7 views
7

Ich habe einige Fragen zur Codierung einer Bilddatei in base64 gesehen, aber wie ist es umgekehrt - wie stelle ich ein Bild aus einer Base64-Zeichenfolge in einer XML-Datei wieder her?XSLT: base64-Daten in Bilddateien umwandeln

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

die über XML-Knoten resource, Bedenkt man, wie gehe ich über clip_image001.gif zu schaffen?

Bitte machen:

  1. XSLT-Prozessoren und/oder Erweiterungen dies zu ermöglichen, sowie
  2. eine Probe XSLT, die die Umwandlung

Hinweis auslöst, dass es in der Lage sein muss, zumindest zu handhaben GIF & PNG-Dateiformate. Vorzugsweise nicht auf irgendein Betriebssystem beschränkt.


Implementiert Lösung

Basierend um Mads Hansen's Lösung. Der Hauptunterschied besteht darin, dass ich net.sf.saxon.value.Base64BinaryValue direkt in meinem Namespace referenzierte, anstatt den Namespace saxon zu verwenden, weil ich die Java APIs intuitiver verstand als die Beschreibungen der base64Binary-to-octets und base64Binary Funktionen der Saxonica Website.

<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. Siehe sibling question für meine Implementierung, wie die Hashes erhalten werden, die notwendig sind, um die Bilddateien zu identifizieren.


Diese Frage ist eine Teilfrage von another question I have asked previously.

Antwort

9

I found this entry from the XSL maiing lists, die beschreibt, wie die Funktion Saxon Erweiterung xs verwenden: base64Binary-to-Oktett in eine Datei aus streamen die Java Fileoutputstream in einem XSLT 2.0 Stylesheet mit:

<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

Danke! Das ist, was ich wollte, weil es die Bilder tatsächlich in externe Dateien schreibt. – bguiz

+0

Ich denke, es sollte 'saxon: base64Binary-to-Octets' sein (mit dem nachgestellten' s'). Siehe http://www.saxonica.com/documentation/extensions/functions.html –

+0

Danke, Jackem. Ich habe das Codebeispiel korrigiert. –

1

In HTML umwandeln.

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

Welche XSLT-Prozessor und Erweiterungen verwenden Sie? – bguiz

+0

Und ich möchte in der Lage sein, die Bilddateien tatsächlich zu erzeugen, das heißt clip_image001.gif erstellen und dann in der Ausgabe html bekommen, weil ich auch einen Hash von der Bilddatei erzeugen muss. – bguiz

6

Die folgenden Werke:

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

+1 @StrangeDays: Danke für Ihre Antwort! Ich werde mir das (vor langer Zeit) nicht so bald ansehen, aber wenn es tatsächlich funktioniert, sieht es wie eine viel gepflegtere und elegantere Lösung aus als die anderen, die hier bisher vorgeschlagen wurden. – bguiz

+0

hat dort ein Leerzeichen vergessen: Steven

+0

Dies ist HTML-IMG-Element mit BASE64-Quelle generieren. Nicht gerade eine Antwort auf die Frage. –

0

Es gibt eine bessere metho Verfügbar seit Saxon 9.5 über das Erweiterungsmodul EXPath File (verfügbar in Saxon-PE und Saxon-EE).

Hier ist ein Fragment des Codes Ich binäre Bilddateien von Word-Dokumenten zu extrahieren bin mit (Quelle XML ist in WordProcessingML-Format):

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