代码之家  ›  专栏  ›  技术社区  ›  bguiz

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

  •  7
  • bguiz  · 技术社区  · 16 年前

    关于如何在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. 触发 转换

    请注意,它必须至少能够处理gif&png文件格式。最好不限于任何操作系统。


    实施的解决方案

    基于周围 Mads Hansen's 解决方案。主要区别在于我引用了 net.sf.saxon.value.Base64BinaryValue 直接在我的命名空间中,而不是使用 saxon 命名空间,因为我对Java API的理解比SAXONICA网站描述的更直观。 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>
    ...
    

    P.S. sibling question 为了实现如何获取识别图像文件所需的散列值。


    这个问题是 another question I have asked previously .
    4 回复  |  直到 9 年前
        1
  •  9
  •   Mads Hansen    16 年前

    I found this entry from the XSL maiing lists 它描述了如何使用 Saxon扩展函数 xs:base64二进制到八位字节 在XSLT 2样式表中使用Java FielOutsFielts将其流到文件:

    <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>
    
        2
  •  6
  •   Community Mohan Dere    13 年前

    以下工作:

    <img>
      <xsl:attribute name="src">
        <xsl:value-of select="concat('data:image/gif;base64,',xPath)"/>
      </xsl:attribute>
    </img>
    
        3
  •  1
  •   ChaosPandion    16 年前

    将其转换为HTML。

    <img src="data:{mime};base64,{data}" />
    
        4
  •  0
  •   ju1ce--    9 年前

    自从Saxon9.5以来,有一种更好的方法可以通过expath文件扩展模块(在SaxonPE和SaxonEE中可用)。

    以下是我用来从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>