Pasar de Word a XML (3)

Este artículo es una continuación de otros anteriores con el mismo título, en los que se explicaba una forma rápida de conseguir un proyecto básico XML a partir de un documento Word 2000.

Después de explicar en el anterior artículo un sistema de reemplazamiento automatizado de un código HTML por otro código con etiquetas XML personalizadas, toca ahora el turno a un estudio del desarrollo de una macro personalizada para realizar el proceso de obtención de sustitución de un código HTML por otro XML, de una sola vez.

En este artículo se va a comentar también la realización de una plantilla CSS específica para formatear el código XML conseguido con la macro.

Notas: Para comprobar los ejemplos que siguen a continuación, es imprescindible disponer de Internet Explorer 5. Esta versión del documento cumple las normas HTML 4. Existen otras versiones del mismo documento adaptadas a XHTML y a XML.

Introducción

En primer lugar, vamos a recuperar el documento HTML que se creó en el primer artículo de esta serie, denominado articulo_promocion_4.htm, ya que nos va a servir de documento de partida para nuestro proyecto.

En segundo lugar, vamos a estudiar con detenimiento las etiquetas utilizadas en dicho documento HTML, que podemos resumir en las siguientes:

<html> </html>
<head> </head>
<title> </title>
<body link="blue" vlink="purple"> </body>
<div> <div>
<h1 align="center"> </h1>
<h3> </h3>
<p align="center"> </p>
<p align="right"> </p>
<p> </p>
<i> </i>
<b> </b>
<u> </u>
<table border="1" cellspacing="0" cellpadding="0"> </table>
<tr> </tr>
<td rowspan="2" valign="bottom"> </td>
<td colspan="3" valign="top"> </td>
<td valign="top"> </td>
<a target="_blank" href="..."> </a>
<img src="..." alt="..." border="1"/>

Y por último, vamos a indicar las etiquetas que deseamos eliminar del código HTML, las que queremos sustituir por otras XML, las que decidimos dejar para que sigan actuando como HTML, y las nuevas etiquetas XML que necesitamos incorporar en nuestro nuevo código XML:

Etiqueta HTML Cambiar por... Comentario
<html> <Artículo ...> Etiqueta raíz-XML
<head>

 

Eliminar
<title> <Título> Título-XML
<body ...>

 

Eliminar
<div>

 

Eliminar
<h1 align="center"> <TítuloP> Título Principal-XML
<h3> <TítuloS> Título Secundario-XML
<p align="center"> <Autor ...> XML
<p align="right"> <p atrib="fecha"> párrafo-fecha-XML
<p> Se deja igual párrafo-XML
<i> <cur> cursiva-XML
<b> <neg> negrita-XML
<u> <sub> subrayado-XML
<table ...> <html:table ...> HTML
<tr> <html:table> HTML
<td ...> <html:td ...> HTML
<a ...> <html:a ...> HTML
<img ...> <html:img ...> HTML

 

Añadir XML Comentario

 

<?xml version="1.0" ...> Declaración-XML

 

<?xml-stylesheet ...> Hoja de estilo-XML

Una vez aclarados estos puntos, es el momento de pasar el código HTML del documento de partida a Word 2000 y de crear una nueva macro en Word, tal como se ha explicado en la segunda parte de este artículo.

Nota: Da igual el nombre que se ponga a la macro (MacroXML estaría bien) y el reemplazamiento que se grabe, pues el código final va a ser definido por nosotros en la aplicación Microsoft Visual Basic, añadiendo las secciones de código que controlen las sustituciones de la forma adecuada.

Posición inicial

Después de crear la macro MacroXML y de activar el editor Microsoft Visual Basic, es importante que tengamos una estructura como la siguiente:

Sub MacroXML()
'
' MacroXML Macro
' Macro grabada el xx/xx/2000 por Ramón Montero
'
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    ......
    ......
End Sub

Da igual el contenido de las líneas que ocupen el espacio marcado con las series de puntos (......), pues aquí es donde vamos a incluir las secciones de código que vayamos añadiendo.

Nota: Recuerde el lector que cada vez que se añada código VB a la macro, hay que guardarlo para poder ejecutarlo desde Word 2000, y también, que para poder ver el efecto al completo de la macro, el código presente en el documento Word debe ser el original.

Sustituciones simples

Existen varios tipos de sustituciones de etiquetas, tal como se puede apreciar si se analiza con atención el código HTML.

Las más fáciles de controlar son las que aparecen sin atributos y es preciso sustituir por otras etiquetas XML sin atributos. Son los casos de <title>, <h3>, <b>, <i> y <u>.

En estos casos se pueden realizar la sustitución de las etiquetas de principio y de final de una sola vez, ya que es suficiente con poner title>, h3>, b>, i> y u> en el campo de búsqueda y las correspondientes Título>, TítuloS>, neg>, cur> y sub> en el campo de reemplazar.

Como ejemplo, el código Visual Basic para conseguir la sustitución de <title>, sería:

  With Selection.Find
    .Text = "title>"
    .Replacement.Text = "Título>"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll

Las restantes etiquetas requieren las correspondientes secciones adaptadas a sus nombres.

Eliminación de etiquetas

La eliminación de etiquetas es también muy fácil de controlar, aunque en este caso, es necesario realizar dos acciones, una para la etiqueta de principio y otra para la de final. Es suficiente con dejar el campo de reemplazar vacío para que funcione la eliminación.

Los casos de <head>, <body ...> y <div> son los afectados por la eliminación en nuestro documento de ejemplo.

El código Visual Basic para conseguir la sustitución de <head>, sería:

  With Selection.Find
    .Text = "<head>" 
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll
  With Selection.Find
    .Text = "</head>"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll

Sustituciones de atributos

Cuando se trata de conseguir la sustitución de atributos de etiquetas, el sistema es similar al de las sustituciones simples, ya que se puede hacer de una sola pasada.

Es el caso de la etiqueta <p align="right">, que debe ser reemplazada por <p atrib="fecha">.

El código Visual Basic para conseguir esta sustitución sería:

  With Selection.Find
    .Text = "<p align="right">"
    .Replacement.Text = "<p atrib="fecha">"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll

Adaptación al HTML

La adaptación de cierto código XML al HTML es casi obligatorio mientras no se generalicen las especificaciones SVG, XForms, XPointer y XLink. Esto se suele hacer incorporando un espacio de nombre propio para el HTML, lo que implica que las etiquetas que van a ser tratadas como HTML lleven el prefijo html:.

Es preciso, por tanto, sustituir las etiquetas <table>, <tr>, <td>, <a ...> y <img ...>, por las correspondientes <html:table>, <html:tr>, <html:td>, <html:a ...> y <html:img ...>, sin olvidarnos que hay etiquetas de principio y de final.

Una sección VB de ejemplo para la sustitución de <a ...> sería:

  With Selection.Find
    .Text = "<a "
    .Replacement.Text = "<html:a "
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll
  With Selection.Find
    .Text = "</a>"
    .Replacement.Text = "</html:a>"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll

Sustituciones complejas

Existe una sustitución un tanto compleja, que debe ser tratada aparte. Se trata de sustituir toda la línea HTML:

<p align="center"><i>Ramón Montero</i></p>

Por esta otra línea XML:

<autor>
  <html:a href="mailto:[email protected]">Ramón Montero</html:a>
</autor>

Para conseguirlo, vamos ordenar tres operaciones: localizar las palabras >Ramón Montero<, borrar toda la línea HTML y añadir la línea XML. Esto se consigue con el siguiente código VB:

  Selection.Find.ClearFormatting
  With Selection.Find
    .Text = ">Ramón Montero<"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute
  Selection.HomeKey Unit:=wdLine
  Selection.EndKey Unit:=wdLine, Extend:=wdExtend
  Selection.Delete Unit:=wdCharacter, Count:=1
  Selection.TypeText Text:= _
   "<autor>
      <html:a href=""mailto:[email protected]"">Ramón Montero</html:a>
    </autor>"
  Selection.TypeParagraph

Sustitución y añadido

Ya solo queda sustituir la etiqueta <html> por una serie de líneas que incluyen la declaración XML, la declaración de la hoja de estilo y la etiqueta raíz XML, aprovechando esta última para definir un espacio de nombre para HTML.

En realidad es una sustitución de dos pasos como otra cualquiera, salvo que en este caso hay que incluir varias líneas en sustitución de la etiqueta de principio.

El código VB capaz de realizar ésto es el siguiente:

  With Selection.Find
    .Text = "<html>"
    .Replacement.Text = "<?xml version=""1.0"" encoding=""ISO-8859-1""?>^p_
       <?xml-STYLESHEET href=""articulo.css"" type=""text/css""?>^p_
       <artículo xmlns:html=""uri:html"">"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll
  With Selection.Find
    .Text = "</html>"
    .Replacement.Text = "</articulo>"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll

La única novedad de esta sección es la forma de indicar un salto de línea, que se marca mediante ^p.

Hoja de estilo CSS

Para que el documento XML se muestre en la pantalla bien formateado, es preciso disponer de la plantilla CSS adecuada, que en este caso se corresponde con el archivo articulo.css.

En este archivo debe incluirse el formato de cada una de las etiquetas correspondientes a los elementos que forman el documento XML.

La descripción de las etiquetas XML se realiza de la forma:

TítuloP {display:block;font-size:16pt;color:red;font-family:Arial;
text-align:center}
TítuloS {display:block;font-size:12pt;color:blue;font-family:Arial;
text-align:right}
p {display:block;font-size:10pt;color:black;font-family:Verdana;
text-align:justify}
neg {display:inline;font-weight:bold}
cur {display:inline;font-style:italic}
......

Estas descripciones son típicas CSS, siendo de destacar la diferencia entre los formatos que se desean presentar como una caja (display:block), o los que se deben tratar como un elemento interno (display:inline).

Las descripciones del formato de las etiquetas que se desea que se ajusten a las normas HTML deben ser definidas de forma un tanto especial, del modo siguiente:

html:a {text-decoratión:underline;color:red;font-family:Verdana;
text-size:10pt}
html:table {font-family:Courier;text-size:12pt}
......

En realidad, las descripciones de elementos XML ajustados al HTML utilizan las mismas normas CSS, con la salvedad de que anteponen el prefijo html: al nombre de la etiqueta.

Por supuesto, que si el lector prefiere utilizar una hoja de estilo XSL, debe definirla con las características que considere más idóneas, teniéndola en cuenta al definir la declaración de la hoja de estilo en el documento XML.

Conclusiones finales

Si el lector crea una macro que mantenga estas secciones de acuerdo con la tabla inicial y las aplica al documento HTML original, disponible en Word 2000, conseguirá en unos segundos un documento XML adaptado a las condiciones expresadas en dicha tabla. Ya solo tiene que seleccionar el código resultante, copiarlo al Bloc de notas y guardarlo con el nombre adecuado, para disponer del documento en formato XML.

Es posible que se pueda plantear la duda de que el tiempo necesario para conseguir una macro de estas características puede ser mayor incluso que el que se necesitaría para realizar el trabajo "a mano", adaptando cada una de las etiquetas con el teclado, y puede ser verdad si solo hay que transformar un único artículo, pero si es el caso de que es preciso la transformación de varios documentos HTML con el mismo estilo, se entiende la utilidad de disponer de esta útil y fácil de conseguir MacroXML.

Por ejemplo, el lector habrá observado que los artículos de la sección <recursos XML /> de RAMON.ORG, se presentan en varios formatos, siendo un ejemplo práctico de una posible utilización de MacroXML, para conseguir en unos segundos un documento XML a partir del artículo inicial creado en HTML.

Nota: Para realizar la transformación de los artículos en formato HTML a XML-CSS, yo utilizo una aplicación propia que me proporciona más posibilidades que las de una macro de Word, pero es perfectamente posible realizar todo el proceso con MacroXML.

Si las condiciones que el lector necesita para sus transformaciones particulares son distintas de las explicadas aquí, y precisa de algún código VB diferente, solo tiene que activar la orden de grabar una macro, reproducir las acciones que desea realizar, detener la macro, ver su código en el editor Microsoft Visual Basic, seleccionarlo, copiarlo y añadirlo al código de la macro principal.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.