我已经看到了几个关于如何在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
?
请建议:
请注意,它必须能够至少处理GIF和PNG文件格式。优选地不限于任何OS。
基于Mads Hansen's解决方案。主要区别在于我直接在我的命名空间中引用net.sf.saxon.value.Base64BinaryValue
而不是使用saxon
命名空间,因为我比Saxonica网站对base64Binary-to-octets
和{{1的描述更直观地理解Java API函数。
base64Binary
P.S。有关如何获取识别图像文件所需的哈希值的实现,请参阅sibling question。
<小时/> 这个问题是another question I have asked previously的一个子问题。
答案 0 :(得分:9)
I found this entry from the XSL maiing lists描述了如何使用 Saxon扩展函数 xs:base64Binary-to-octet 使用Java FileOutputStream将其流式传输到文件中一个XSLT 2.0样式表:
<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>
答案 1 :(得分:6)
以下作品:
<img>
<xsl:attribute name="src">
<xsl:value-of select="concat('data:image/gif;base64,',xPath)"/>
</xsl:attribute>
</img>
答案 2 :(得分:1)
将其转换为HTML。
<img src="data:{mime};base64,{data}" />
答案 3 :(得分:0)
自Saxon 9.5以来,有一种更好的方法可以通过EXPath File扩展模块(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>