Pregunta

@Solved

Las dos preguntas secundarias que he creado se han resuelto (¡sí, por dividir esta!), por lo que esta está resuelta. Otorgaré la marca de verificación a samjudson , ya que su respuesta fue la más cercana. Sin embargo, para soluciones de trabajo reales, consulte las siguientes preguntas secundarias; tanto mis soluciones implementadas como las respuestas verificadas.

@Deprecated

Estoy dividiendo esta pregunta en dos preguntas separadas, ya que este es un problema bastante complicado. Sin embargo, las respuestas son bienvenidas.

Las preguntas son:

  1. XSLT: Convierta datos de base64 en archivos de imagen
  2. XSLT: Obtención o coincidencia de hashes para datos codificados en base64

Hola, me pregunto si alguien aquí ha tenido éxito en la conversión de formato de exportación de Evernote , que es XML, a HTML incluyendo las imágenes. Sé que Evernote tiene una función de exportación a HTML que hace esto, pero eventualmente quiero hacer cosas más elegantes con ella.

He logrado obtener el texto solo usando el siguiente XSLT:

Código de muestra eliminado

Ver preguntas secundarias para soluciones implementadas.

Sin embargo, a.t.m. esto simplemente ignora cualquier imagen, y aquí es donde necesito ayuda.

Bloque de tropiezos # 1 : Evernote almacena sus imágenes como GIF o PNG, y cuando se exporta, incrusta estos GIF & amp; PNGs directamente en el XML usando lo que parece ser base64 (podría estar equivocado). Necesito poder reconstituir las imágenes. Si abre el archivo en un editor de texto, busque los enormes bloques de datos en **//note/resource/data**. Por ejemplo (sangrías agregadas manualmente):

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

Bloque de tropiezos # 2 : Evernote almacena los nombres de archivo de cada imagen en el nodo de recursos
**//note/resource/resource-attributes/file-name**
sin embargo, en la nota real en la que se refiere a la imagen, hace referencia a la imagen no por el nombre del archivo, sino por su hash, por ejemplo:

<en-media hash="4aaafc3e14314027bb1d89cf7d59a06c" type="image/gif" border="0" width="16" height="16" alt="Alt Text"/>

¿Alguien puede arrojar algo de luz sobre cómo manejar los datos binarios codificados (base64) dentro de XML?

Editar

Entiendo por los comentarios & amp; responde que el viejo XSLT no hará el trabajo de manejar imágenes. El procesador XSLT que estoy usando es Xalan , sin embargo, si esto no es bueno suficiente para el procesamiento de imágenes o base64, ¡entonces sugiero uno que haga esto!

Además, según lo solicitado, aquí hay un archivo de exportación de Evernote de muestra. Los clips de código anteriores son simplemente partes seleccionadas de esto. Lo eliminé para que contenga solo una nota y edité la mayor parte del texto, y agregué sangrías para mayor claridad.

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

Y esto necesita ser transformado en esto:

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

Con el archivo clip_image001.gif generado y guardado.

¿Fue útil?

Solución

Hay una nueva especificación de URI de datos http://en.wikipedia.org/wiki/Data_URI_scheme que puede ser de alguna ayuda siempre que solo tenga la intención de admitir navegadores modernos, y sus imágenes sean pequeñas (por ejemplo, IE8 solo admite < imágenes de 32k).

Aparte de eso, lo único que puede hacer es usar algunos scripts externos para exportar los datos de la imagen al archivo y usarlos. Esto dependerá en gran medida del procesador XSLT que esté utilizando.

Otros consejos

Existe una respuesta XSLT pura a este problema; mira esta página

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top