Domanda

Il mio obiettivo è quello di costruire un motore che prenda gli ultimi documenti CDA di HL7 3.0 e li renda compatibili con l'HL7 2.5 che è una bestia radicalmente diversa.

Il documento CDA è un file XML che, se associato al file XSL corrispondente, rende un documento HTML adatto alla visualizzazione per l'utente finale.

In HL7 2.5 ho bisogno di ottenere il testo renderizzato, privo di qualsiasi markup e piegarlo in un flusso di testo (o simile) che posso scrivere in 80 righe di caratteri per popolare il messaggio HL7 2.5.

Finora sto adottando un approccio per usare XslCompiledTransform per trasformare il mio documento XML usando XSLT e prodotto un documento HTML risultante.

Il mio prossimo passo è prendere quel documento (o forse ad un passo prima di questo) e renderizzare l'HTML come testo. Ho cercato per un po ', ma non riesco a capire come farlo. Spero sia qualcosa di facile che sto solo trascurando, o semplicemente non riesco a trovare i termini di ricerca magici. Qualcuno può offrire qualche aiuto?

FWIW, ho letto le altre 5 o 10 domande in SO che abbracciano o ammoniscono usando RegEx per questo, e non credo di voler percorrere quella strada. Ho bisogno del testo renderizzato.

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());
        }
    }
}
È stato utile?

Soluzione

Dato che hai il sorgente XML, considera di scrivere un XSL che ti darà l'output che desideri senza il passaggio HTML intermedio. Sarebbe molto più affidabile che provare a trasformare l'HTML.

Altri suggerimenti

Questo ti lascerà solo con il testo:

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>";
}

Oppure puoi usare un'espressione regolare:

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

Puoi usare qualcosa come questo quale utilizza lynx e perl per rendere l'html e poi convertirlo in testo normale?

Questo è un ottimo caso d'uso per XSL: FO e FOP. FOP non è solo per l'output PDF, uno degli altri output principali supportati è il testo. Dovresti essere in grado di costruire un semplice foglio di stile xslt + fo con le specifiche (ovvero la larghezza della linea) che desideri.

Questa soluzione è un po 'più pesante che usare solo xml - > xslt - > testo come suggerito da ScottSEA, ma se hai requisiti di formattazione più complessi (es. rientro), diventerà molto più facile da esprimere in fo, che deridere in xslt.

Eviterei le regex per l'estrazione del testo. È troppo basso livello e garantito per essere fragile. Se vuoi solo testo e 80 righe di caratteri, il modello xslt predefinito stamperà solo il testo dell'elemento. Una volta che hai solo il testo, puoi applicare qualunque elaborazione di testo sia necessaria.

Per inciso, lavoro per un'azienda che produce CDA come parte del nostro prodotto (riconoscimento vocale per le citazioni). Vorrei esaminare un XSLT che trasforma il 3.0 direttamente in 2.5. A seconda della fedeltà che si desidera mantenere tra le due versioni, l'intero percorso XSLT sarà probabilmente la soluzione più semplice se ciò che si desidera ottenere è la conversione tra i formati. Questo è ciò che XSLT è stato creato per fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top