Pregunta

Mi objetivo es construir un motor que tome los últimos documentos CDA HL7 3.0 y hacerlos compatibles con HL7 2.5, que es una bestia radicalmente diferente.

El documento CDA es un archivo XML que, cuando se combina con su archivo XSL correspondiente, hace que un documento HTML sea apto para mostrarlo al usuario final.

En HL7 2.5 necesito obtener el texto renderizado, sin ningún marcado, y doblarlo en una secuencia de texto (o similar) que pueda escribir en 80 líneas de caracteres para completar el mensaje HL7 2.5.

Hasta ahora, estoy adoptando un enfoque de usar XslCompiledTransform para transformar mi documento XML usando XSLT y crear un documento HTML resultante.

Mi siguiente paso es tomar ese documento (o tal vez un paso antes) y renderizar el HTML como texto. He buscado durante un tiempo, pero no puedo entender cómo lograr esto. Espero que sea algo fácil que solo estoy pasando por alto, o simplemente no puedo encontrar los términos de búsqueda mágicos. ¿Alguien puede ofrecer ayuda?

FWIW, he leído las 5 o 10 otras preguntas en SO que incluyen o amonestan el uso de RegEx para esto, y no creo que quiera seguir ese camino. Necesito el texto renderizado.

using System;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;

public class TransformXML
{

    public static void Main(string[] args)
    {
        try
        {

            string sourceDoc = "C:\\CDA_Doc.xml";
            string resultDoc = "C:\\Result.html";
            string xsltDoc = "C:\\CDA.xsl";

            XPathDocument myXPathDocument = new XPathDocument(sourceDoc);
            XslCompiledTransform myXslTransform = new XslCompiledTransform();

            XmlTextWriter writer = new XmlTextWriter(resultDoc, null);
            myXslTransform.Load(xsltDoc);

            myXslTransform.Transform(myXPathDocument, null, writer);

            writer.Close();

            StreamReader stream = new StreamReader (resultDoc);

        }

        catch (Exception e)
        {
            Console.WriteLine ("Exception: {0}", e.ToString());
        }
    }
}
¿Fue útil?

Solución

Dado que tiene la fuente XML, considere escribir un XSL que le dará la salida que desea sin el paso HTML intermedio. Sería mucho más confiable que tratar de transformar el HTML.

Otros consejos

Esto te dejará solo con el texto:

class Program
{
    static void Main(string[] args)
    {
        var blah =  new System.IO.StringReader(sourceDoc);
        var reader = System.Xml.XmlReader.Create(blah);
        StringBuilder result = new StringBuilder();

        while (reader.Read())
        {
            result.Append( reader.Value);
        }
        Console.WriteLine(result);
    }

    static string sourceDoc = "<html><body><p>this is a paragraph</p><p>another paragraph</p></body></html>";
}

O puede usar una expresión regular:

public static string StripHtml(String htmlText)
{
    // replace all tags with spaces...
   htmlText = Regex.Replace(htmlText, @"<(.|\n)*?>", " ");

   // .. then eliminate all double spaces
   while (htmlText.Contains("  "))
   {
       htmlText = htmlText.Replace("  ", " ");
    }

   // clear out non-breaking spaces and & character code
   htmlText = htmlText.Replace("&nbsp;", " ");
   htmlText = htmlText.Replace("&amp;", "&");

   return htmlText;
}

¿Puedes usar algo como esto que usa lynx y perl para representar el html y luego convertirlo a texto sin formato?

Este es un gran caso de uso para XSL: FO y FOP. FOP no es solo para la salida en PDF, una de las otras salidas principales que es compatible es el texto. Debería poder construir una hoja de estilo simple xslt + fo que tenga las especificaciones (es decir, el ancho de línea) que desee.

Esta solución será un poco más pesada que solo usar xml - > xslt - > texto como ScottSEA sugirió, pero si tiene requisitos de formato más complejos (por ejemplo, sangría), será mucho más fácil de expresar en fo, que burlarse de xslt.

Evitaría expresiones regulares para extraer el texto. Eso es demasiado bajo y garantiza que sea frágil. Si solo desea texto y 80 líneas de caracteres, la plantilla xslt predeterminada solo imprimirá el texto del elemento. Una vez que tenga solo el texto, puede aplicar el procesamiento de texto que sea necesario.

Por cierto, trabajo para una empresa que produce CDA como parte de nuestro producto (reconocimiento de voz para notificaciones). Buscaría un XSLT que transforma el 3.0 directamente en 2.5. Dependiendo de la fidelidad que desee mantener entre las dos versiones, la ruta XSLT completa probablemente será su apuesta más fácil si lo que realmente quiere lograr es la conversión entre los formatos. Para eso fue creado XSLT.

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