XSLT:Base64データを画像ファイルに変換する
-
18-09-2019 - |
質問
画像ファイルを Base64 でエンコードする方法に関するいくつかの質問を見てきましたが、その逆はどうすればよいでしょうか。XML ファイルに保存されている Base64 文字列から画像を再構成するにはどうすればよいでしょうか?
<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>
上記の XML ノードを考慮すると、 resource
, 、作成するにはどうすればよいですか clip_image001.gif
?
提案してください:
- XSLT プロセッサや拡張機能によりこれが可能になります。
- 変換をトリガーするサンプルXSLT
少なくとも GIF および PNG ファイル形式を処理できる必要があることに注意してください。どの OS にも制限されないことが望ましいです。
実装されたソリューション
を中心に マッツ・ハンセンの 解決。主な違いは、私が参照したことです net.sf.saxon.value.Base64BinaryValue
を使用するのではなく、名前空間で直接 saxon
名前空間については、Saxonica Web サイトの説明よりも Java API の方が直感的に理解できたためです。 base64Binary-to-octets
そして base64Binary
機能。
<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>
...
追伸見る 兄弟の質問 画像ファイルを識別するために必要なハッシュを取得する方法の実装に使用します。
この質問は次のサブ質問です 以前に尋ねた別の質問.
解決
XSL メーリング リストからこのエントリを見つけました の使用方法を説明しています。 サクソン拡張関数 xs:base64バイナリからオクテットへ XSLT 2.0 スタイルシートの Java FileOutputStream を使用してファイルにストリーミングするには、次のようにします。
<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>
他のヒント
以下の作品:
<img>
<xsl:attribute name="src">
<xsl:value-of select="concat('data:image/gif;base64,',xPath)"/>
</xsl:attribute>
</img>
それをHTMLに変換します。
<img src="data:{mime};base64,{data}" />
Saxon 9.5 以降では、EXPath ファイル拡張モジュール (Saxon-PE および Saxon-EE で利用可能) を介して利用できる、より良い方法があります。
これは、Word 文書からバイナリ画像ファイルを抽出するために使用しているコードの一部です (ソース XML は 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>