2009-11-06 45 views
7

Tôi đã thấy một số câu hỏi về cách mã hóa tệp hình ảnh trong base64, nhưng cách khác xung quanh - làm cách nào để tái tạo hình ảnh từ chuỗi base64 được lưu trữ trong tệp XML?XSLT: Chuyển đổi dữ liệu base64 thành tệp hình ảnh

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

Với nút XML ở trên resource, làm cách nào để tạo khoảng clip_image001.gif?

Xin gợi ý:

  1. bộ xử lý XSLT và/hoặc phần mở rộng cho phép này, cộng với
  2. một XSLT mẫu mà gây nên các chuyển đổi

Lưu ý rằng nó phải có khả năng xử lý ít nhất GIF & Định dạng tệp PNG. Tốt nhất là không giới hạn ở bất kỳ hệ điều hành nào.


giải pháp thực hiện

Dựa xung quanh giải pháp Mads Hansen's. Sự khác biệt chính là tôi đã tham chiếu net.sf.saxon.value.Base64BinaryValue trực tiếp trong không gian tên của tôi thay vì sử dụng không gian tên saxon, bởi vì tôi hiểu các API Java trực quan hơn các mô tả của trang web Saxonica về các chức năng base64Binary-to-octetsbase64Binary.

<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. Xem sibling question để tôi triển khai cách lấy các băm cần thiết để xác định các tệp hình ảnh.


Câu hỏi này là câu hỏi con của another question I have asked previously.

Trả lời

9

I found this entry from the XSL maiing lists mô tả làm thế nào để sử dụng Saxon chức năng mở rộng xs: base64Binary-to-octet stream nó ra vào một tập tin bằng cách sử dụng Java FileOutputStream trong một XSLT 2.0 stylesheet:

<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> 
+0

Cảm ơn bạn! Đây là những gì tôi muốn, cos nó thực sự viết các hình ảnh vào các tập tin bên ngoài. – bguiz

+0

Tôi nghĩ rằng nó phải là 'saxon: base64Binary-to-octets' (với dấu' s'). Xem http://www.saxonica.com/documentation/extensions/functions.html –

+0

Cảm ơn, Jackem. Tôi đã sửa mẫu mã. –

1

Chuyển đổi thành HTML.

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

gì xử lý XSLT và phần mở rộng nào bạn sử dụng? – bguiz

+0

Và tôi muốn có thể thực sự tạo ra các tập tin hình ảnh, đó là tạo clip_image001.gif, và sau đó trong đầu ra html có được , bởi vì tôi cần phải tạo ra một băm từ tập tin hình ảnh là tốt. – bguiz

6

Các công việc sau:

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

+1 @StrangeDays: Cảm ơn câu trả lời của bạn! Tôi sẽ không xem xét điều này (một thời gian dài trước đây) bất cứ lúc nào sớm, nhưng nếu nó thực sự làm việc, nó trông giống như một giải pháp gọn gàng hơn và thanh lịch hơn so với những người khác được đề xuất ở đây cho đến nay. – bguiz

+0

quên một không gian ở đó: Steven

+0

Điều này là để tạo ra phần tử HTML IMG với nguồn BASE64. Không chính xác câu trả lời cho câu hỏi. –

0

Có metho tốt hơn có sẵn từ Saxon 9.5 thông qua mô-đun mở rộng tệp Expath (có sẵn trong Saxon-PE và Saxon-EE).

Đây là một đoạn của mã Tôi đang sử dụng để trích xuất tập tin hình ảnh nhị phân từ các tài liệu Word (nguồn XML là định dạng 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> 
Các vấn đề liên quan