2009-11-06 33 views
7

我看到的如何編碼以base64圖像文件的幾個問題,但如何對周圍的其他方式 - 我該如何重建從存儲在XML文件中的base64字符串的圖片?XSLT:的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文件格式。優選地不限於任何OS。


實施的解決方案

基於周圍Mads Hansen's溶液。主要區別是,我直接在我的命名空間中引用net.sf.saxon.value.Base64BinaryValue而不是使用saxon命名空間,因爲我理解的Java API比更直觀的base64Binary-to-octetsbase64Binary功能Saxonica網站的描述。

<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的子問題。

回答

9

I found this entry from the XSL maiing lists描述如何使用撒克遜擴展函數的xs:

<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> 
:base64Binary的至八位字節
使用Java FileOutputStream中在XSLT 2.0樣式表以流出來到文件
+0

謝謝!這是我想要的,因爲它實際上是將圖像寫入外部文件。 – bguiz 2009-11-07 10:51:43

+0

我認爲它應該是'saxon:base64Binary-to-octets'(跟着's'')。見http://www.saxonica.com/documentation/extensions/functions.html – 2009-11-07 20:53:07

+0

謝謝,傑克姆。我已更正了代碼示例。 – 2009-11-07 21:05:14

1

將其轉換爲HTML。

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

你用什麼XSLT處理器和擴展? – bguiz 2009-11-06 03:15:30

+0

我希望能夠實際生成圖像文件,即創建clip_image001.gif,然後在輸出html中獲取,因爲我還需要從圖片文件生成哈希。 – bguiz 2009-11-06 06:56:50

6

以下工作:

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

+1 @StrangeDays:感謝您的回答!我不會很快看到這個(很久以前),但如果它確實有效,它看起來像比迄今爲止所提出的其他建議更加整潔優雅的解決方案。 – bguiz 2010-11-18 05:54:19

+0

在那裏忘了空格: Steven 2012-12-03 08:02:03

+0

這是用BASE64源生成HTML IMG元素。不完全是問題的答案。 – 2014-03-23 09:05:09

0

有一個更好的方法d自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>