@已解决
我创建的两个子问题已经得到解决(拆分这个问题太好了!),所以这个问题已经解决。我将把勾选标记授予samjudson,因为他的答案最接近。但是,对于实际的工作解决方案,请参见下面的子问题;包括我的实现解决方案和已勾选的答案。
@已弃用
由于这是一个相当复杂的问题,我将其拆分为两个单独的问题。仍然欢迎回答。
子问题如下:
你好,想知道这里是否有人成功将Evernote的导出格式(即XML)转换为包含图片的HTML。我知道Evernote有一个导出为HTML的功能可以实现这一点,但最终我想要更多的花哨效果。
我已经使用以下XSLT成功获取了文本:
示例代码已删除
请参见子问题中的实现解决方案。
然而,目前这仅仅忽略了任何图片,这就是我需要帮助的地方。
障碍#1:Evernote将其图片存储为GIF或PNG,并在导出时直接将这些GIF和PNG嵌入XML中,使用的似乎是base64编码(我可能错了)。我需要能够重建这些图片。如果您在文本编辑器中打开文件,请查找**//note/resource/data**
中的大块数据。例如(手动添加缩进):
<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>
障碍#2: Evernote将每张图片的文件名存储在资源节点下的以下路径中:
**//note/resource/resource-attributes/file-name**
然而,在实际引用图片的笔记中,它不是通过文件名引用图片,而是通过其哈希值引用,例如:
<en-media hash="4aaafc3e14314027bb1d89cf7d59a06c" type="image/gif" border="0" width="16" height="16" alt="Alt Text"/>
有人能解释一下如何处理XML中的(base64)编码二进制数据吗?
编辑
我从评论和答案中了解到,普通的XSLT无法处理图像。我使用的XSLT处理器是Xalan,但如果它不能很好地处理图像或base64,则请建议一个可以处理这些的处理器!
此外,根据要求,这是一个Evernote导出文件的样本。上面的代码片段仅是其选定部分。我已将其简化,仅包含一个笔记,并将大部分文本编辑掉,并添加缩进以提高清晰度。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export.dtd">
<en-export export-date="20091029T063411Z" application="Evernote/Windows" version="3.0">
<note>
<title>A title here</title>
<content><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml.dtd">
<en-note bgcolor="#FFFFFF">
<p>Some text here (followed by the picture)
<p><en-media hash="4aaafc3e14314027bb1d89cf7d59a06c" type="image/gif" border="0" width="16" height="16" alt="A picture"/></p>
<p>Some more text here (preceded by the picture)
</en-note>
]]></content>
<created>20090925T063154Z</created>
<note-attributes>
<author/>
</note-attributes>
<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>
</note>
</en-export>
这需要转换为:
<html>
<body>
<p>Some text here (followed by the picture)
<p><img src="clip_image001.gif" border="0" width="16" height="16" alt="A picture"/></p>
<p>Some more text here (preceded by the picture)
</body>
</html>
文件clip_image001.gif
已生成并保存。
<xsl:element name="tr">
,只需写<tr>
。此外,不要写<xsl:attribute name="{'bgcolor'}">
,而是写<td bgcolor="#AADDFF">
。这样你的样式表会更短。除非您发布一些示例 XML,否则很难提供帮助。同时发布您所在的环境也很有帮助,因为纯 XSLT 不支持 Base64 编码字符串。 - Tomalak