XSLT: Konvertieren base64-Daten in Bilddateien
-
18-09-2019 - |
Frage
Ich habe mehrere Fragen gesehen, wie eine Bilddatei im Base64 zu kodieren, aber wie sei es umgekehrt - wie kann ich ein Bild aus einem Base64-String in einer XML-Datei gespeichert Rekonstitution
<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 oben XML-Knoten resource
gegeben, wie gehe ich über clip_image001.gif
erstellen?
Bitte machen:
- XSLT-Prozessoren und / oder Erweiterungen ermöglichen dies, plus
- eine Probe XSLT, die die Trigger Umwandlung
Beachten Sie, dass es in der Lage sein muss, mindestens GIF & PNG-Dateiformate zu verarbeiten. Vorzugsweise nicht auf jedes Betriebssystem beschränkt.
Implementiert Lösung
Auf der Basis um Mads Hansen Lösung. Hauptunterschied ist, dass ich net.sf.saxon.value.Base64BinaryValue
direkt in meinem Namespace verwiesen, anstatt die saxon
Namespace verwenden, weil ich den Java-APIs intuitiver als die Beschreibungen der Saxonica Webseite verstand der base64Binary-to-octets
und base64Binary
Funktionen.
<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 Geschwister Frage für meine Implementierung, wie zu erhalten die Hashes notwendig, um die Bilddateien zu identifizieren.
Diese Frage ist eine Teilfrage von einer anderen Frage, die ich gefragt habe vorher .
Lösung
Ich fand diesen Eintrag aus den XSL maiing Listen , die beschreibt, wie die Saxon Erweiterungsfunktion xs verwenden: base64Binary-to-Oktett in eine Datei in einem XSLT die Java Fileoutputstream mit ausströmen 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>
Andere Tipps
Die folgenden Werke:
<img>
<xsl:attribute name="src">
<xsl:value-of select="concat('data:image/gif;base64,',xPath)"/>
</xsl:attribute>
</img>
Transformieren es in HTML.
<img src="data:{mime};base64,{data}" />
Es gibt eine bessere Methode zur Verfügung, da Saxon 9.5 über das EXPath Dateierweiterungsmodul (erhältlich in Saxon-PE und Saxon-EE).
Hier ist ein Fragment des Codes verwende ich binäre Bilddateien von Word-Dokumenten (XML-Quell ist in WordProcessingML-Format) zu extrahieren:
<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>