XSLT:将base64数据转换为图像文件
image-processing
7
0

我已经看到了几个有关如何在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

请提出以下建议:

  1. XSLT处理器和/或扩展启用了此功能,此外
  2. 触发转换的样本XSLT

请注意,它必须至少能够处理GIF和PNG文件格式。优选不限于任何操作系统。


已实施的解决方案

基于Mads Hansen的解决方案。主要区别在于,我直接在我的名称空间中引用了net.sf.saxon.value.Base64BinaryValue ,而不是使用saxon命名空间,因为与Saxonica网站对base64Binary-to-octetsbase64Binary函数的描述相比,我更直观地理解了Java API。

<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>
...

PS我的实现请参见同级问题 ,即如何获得识别图像文件所需的哈希。


This question is a subquestion of another question I have asked previously.
参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

以下作品:

<img>
  <xsl:attribute name="src">
    <xsl:value-of select="concat('data:image/gif;base64,',xPath)"/>
  </xsl:attribute>
</img>
收藏
评论

我从XSL maiing列表找到了该条目,该条目描述了如何使用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>
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号