XSLT:将base64数据转换为图像文件

XSLT:将base64数据转换为图像文件,xslt,file-io,image-processing,base64,evernote,Xslt,File Io,Image Processing,Base64,Evernote,我已经看到了一些关于如何在base64中编码图像文件的问题,但另一方面呢?如何从存储在XML文件中的base64字符串中重建图片 <resource> <data encoding="base64"> R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh

我已经看到了一些关于如何在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>
另请参阅,了解我如何获取识别图像文件所需的哈希值的实现


此问题是的子问题。

将其转换为HTML

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

描述如何使用Saxon扩展函数xs:base64Binary to octet在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>

自Saxon 9.5以来,有一种更好的方法可以通过EXPath文件扩展名模块(在Saxon PE和Saxon EE中提供)使用

下面是我用来从Word文档中提取二进制图像文件的代码片段(源XML为WordProcessingML格式):



您使用的XSLT处理器和扩展名是什么?我希望能够实际生成图像文件,即create clip_image001.gif,然后在输出html get中,因为我还需要从图片文件生成哈希。谢谢!这就是我想要的,因为它实际上是在将图像写入外部文件。我认为它应该是
saxon:base64二进制到八位字节
(带有尾随的
s
)。请参阅错误:前缀必须解析为命名空间:xs,在xs:base64Binary(my-base64-encoded-image)行中,更多扩展函数:base64Binary到八位字节unknown@Sarz我认为这是一个高级功能,您需要PE或EE版本+1@StrangedDays:谢谢你的回答!我不打算在短期内对此进行研究(很久以前),但如果它确实有效,那么它看起来确实比目前为止这里建议的其他解决方案更简洁、优雅。这里有一个空白:这是使用BASE64源代码生成HTML IMG元素。这不完全是问题的答案。
<img>
  <xsl:attribute name="src">
    <xsl:value-of select="concat('data:image/gif;base64,',xPath)"/>
  </xsl:attribute>
</img>
<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>