سؤال

لقد رأيت العديد من الأسئلة حول كيفية تشفير ملف صورة في Base64، ولكن ماذا عن الطريقة الأخرى - كيف يمكنني إعادة تكوين صورة من سلسلة Base64 المخزنة في ملف XML؟

<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 على الأقل. يفضل أن لا يقتصر على أي نظام تشغيل.


حلول تنفيذ

مقرها جارس هانسن المحلول. الفرق الرئيسي يجري أن أشير net.sf.saxon.value.Base64BinaryValue مباشرة في مساحة اسمي بدلا من استخدام saxon مساحة الاسم، لأنني فهمت Java APIs بشكل حدسي أكثر من وصف موقع 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>
...

ملاحظة: سؤال الأخ من أجل تنفيذي لكيفية الحصول على الخلاص اللازم لتحديد ملفات الصور.


هذا السؤال هو ضمير سؤال آخر لقد طلبت سابقا.

هل كانت مفيدة؟

المحلول

لقد وجدت هذا الدخول من قوائم XSL Maiing يصف كيفية استخدام سكسون وظيفة تمديد XS: Base64Binary-Octet لتدفقه إلى ملف باستخدام Java FileOutPuttream في ورقة أنماط XSLT 2.0:

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

تحويلها إلى HTML.

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

هناك طريقة أفضل متوفرة منذ سكسونية 9.5 عبر وحدة ملحق ملف Expath File (متوفر في سكسونية 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top