使用xslt解码base64图像数据

时间:2016-08-08 19:42:35

标签: xml python-2.7 xslt lxml

我正在尝试使用单个xml和最多一个xsl样式表,xml文件的内容如下所示

<catalogue>
    <item>
        <item_id>1234</item_id>
        <item_desc>hi-fi sanio</item_desc>
        <price>12.50</price>
        <image>iVBORw0KGgoAAAANSUhEUgAAANIAAAAzCAYAAADigVZlAAA</image>
    </item>
    <item>
        <item_id>4614</item_id>
        <item_desc>lace work</item_desc>
        <price>1.50</price>
        <image>QN0lEQVR4nO2dCXQTxxnHl0LT5jVteHlN+5q+JCKBJITLmHIfKzBHHCCYBAiEw</image>
    </item>
    <item>
        <item_id>614</item_id>
        <item_desc>bicycle</item_desc>
        <price>150</price>
        <image>jVteHlN+5q+JCKBJITLmHIfKzBHHCCYBAiEwlEQVR4nO2dCXQTxxnHl0L</image>
    </item>
</catalogue>

目的是能够与最终用户共享xml文件,以便他们可以使用他们的Web浏览器(IE11)进行查看。

我正在使用python和lxml来创建xml文件我使用base64编码对项目的图像进行了编码,并为每个项目添加了一个图像节点。 我真的想直接在xml中嵌入图像,所以当最终用户打开它时,所有内容都会在浏览器中呈现。即没有超链接

我不知道如何让最终用户浏览器解码图像节点。它们没有任何应用程序可以解码,所以一切都必须在xml或使用浏览器的相关样式表中。

有谁知道是否可以使用xsl解码嵌入在xml文档中的图像? 我可以看看的任何例子,看看它将如何完成。

一般来说,仅使用xml或与xsl一起编码然后解码(嵌入)图像(png / jpg)的好方法是什么?

此致

1 个答案:

答案 0 :(得分:1)

如果您的XML中包含base64编码数据,并且希望在HTML中嵌入img这些数据,那么您可以在XSLT代码中使用{{<img src="data:image/png;base64,{.}"/>构建一个data图像元素1}} URI(https://en.m.wikipedia.org/wiki/Data_URI_scheme)(当然还有图像数据的正确MIME类型),这是一个示例(假设MIME类型为image/png):

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="html" doctype-public="about:legacy-compat" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
      <html>
        <head>
          <title>data URI test</title>
        </head>
        <body>
          <xsl:apply-templates/>
        </body>
      </html>
    </xsl:template>

    <xsl:template match="catalogue">
        <table>
            <thead>
                <xsl:apply-templates select="item[1]" mode="header"/>
            </thead>
            <tbody>
                <xsl:apply-templates/>
            </tbody>
        </table>
    </xsl:template>

    <xsl:template match="item" mode="header">
        <tr>
            <xsl:apply-templates mode="header"/>
        </tr>
    </xsl:template>

    <xsl:template match="item/*" mode="header">
        <th>
            <xsl:value-of select="local-name()"/>
        </th>
    </xsl:template>

    <xsl:template match="item">
        <tr>
            <xsl:apply-templates/>
        </tr>
    </xsl:template>

    <xsl:template match="item/*">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>

    <xsl:template match="item/image">
        <td>
            <img src="data:image/png;base64,{.}"/>
        </td>
    </xsl:template>

</xsl:transform>

分别在http://home.arcor.de/martin.honnen/xslt/test2016080901.xml http://home.arcor.de/martin.honnen/xslt/test2016080901.xsl联机,第一个image元素我使用了维基百科文章中的示例图像数据和所有四个浏览器(IE,Edge,Chrome,Firefox)渲染嵌入的图像。来自输入XML的示例数据似乎没有被识别为image/png,我也尝试了image/jpeg但没有任何成功,我不确定是什么类型的图像数据。