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:

  1. XSLT-Prozessoren und / oder Erweiterungen ermöglichen dies, plus
  2. 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 .

War es hilfreich?

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top