2009-11-06 22 views
7

Widziałem kilka pytań na temat kodowania pliku obrazu w base64, ale jak na odwrót - jak mogę odtworzyć obraz z łańcucha base64 przechowywanego w pliku XML?XSLT: Konwertuj dane base64 na pliki obrazów

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

Mając na uwadze powyższą węzeł XML resource, w jaki sposób przejść o tworzeniu clip_image001.gif?

Proszę zaproponować:

  1. procesory XSLT i/lub rozszerzenia Włącz tę plus
  2. XSLT próbka, która wyzwala konwersji

Należy pamiętać, że musi on być w stanie obsłużyć co najmniej GIF & PNG formaty plików. Korzystnie nie ogranicza się do żadnego systemu operacyjnego.


Wdrożone rozwiązanie

oparciu wokół Mads Hansen's rozwiązania. Główną różnicą jest to, że odwoływałem się do net.sf.saxon.value.Base64BinaryValue bezpośrednio w mojej przestrzeni nazw, zamiast korzystać z przestrzeni nazw saxon, ponieważ intuicyjnie zrozumiałem interfejsy API języka Java niż opisy funkcji witryn Saxonica w zakresie funkcji base64Binary-to-octets i 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. Zobacz sibling question dla mojej realizacji, w jaki sposób uzyskać hashe niezbędne do identyfikacji plików graficznych.


To pytanie jest podpytaniem w języku angielskim: another question I have asked previously.

Odpowiedz

9

I found this entry from the XSL maiing lists który opisuje sposób korzystania z Saxon funkcję rozszerzenia xs: base64Binary do oktetu do przesyłania go do pliku przy użyciu Java FileOutputStream w XSLT 2.0 stylów:

<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

Dziękujemy! To właśnie chciałem, bo to jest pisanie obrazów do plików zewnętrznych. – bguiz

+0

Myślę, że powinno to być 'saxon: base64Binary-to-octets' (z końcowym' s''). Zobacz http://www.saxonica.com/documentation/extensions/functions.html –

+0

Dzięki, Jackem. Poprawiłem próbkę kodu. –

1

Przekształć w HTML.

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

Jaki procesor XSLT i rozszerzenia używacie? – bguiz

+0

I chcę móc generować pliki obrazów, to jest tworzyć clip_image001.gif, a następnie w wyjściowym html uzyskać , ponieważ muszę również wygenerować skrót z pliku obrazu. – bguiz

6

następujące utwory:

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

+1 @StrangeDays: Dziękujemy za odpowiedź! W najbliższym czasie nie będę się nad tym zastanawiał (dawno temu), ale jeśli rzeczywiście działa, to wygląda na bardziej schludne i eleganckie rozwiązanie niż inne sugerowane do tej pory. – bguiz

+0

zapomniałem tam miejsca: Steven

+0

To jest do generowania elementu HTML IMG ze źródłem BASE64. Niezupełnie odpowiedź na to pytanie. –

0

istnieje lepsza meto d dostępne od Saxona 9.5 poprzez moduł rozszerzenia EXPath File (dostępny w Saxon-PE i Saxon-EE).

Oto fragment kodu używam wyodrębnić binarnych plików graficznych z dokumentów Word (źródło XML jest w formacie 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>