Frage

Mein Ziel ist es, einen Motor zu bauen, die die neuesten HL7 3.0 CDA Dokumente nehmen und sie mit HL7 2.5 abwärtskompatibel, das ein radikal anderes Tier ist.

Das CDA-Dokument ist eine XML-Datei, die, wenn sie mit ihrer passenden XSL-Datei macht ein HTML-Dokument fit für die Anzeige an den Endverbraucher gepaart.

In HL7 2.5 Ich brauche den gerenderten Text, ohne jede Markup zu bekommen, und falten Sie es in einen Textstrom (oder ähnlich), die ich in 80 Zeichenzeilen schreiben, kann die HL7 2.5 Nachricht zu füllen.

Bisher ich nehme einen Ansatz XslCompiledTransform die Verwendung meines XML-Dokument mit Hilfe von XSLT und Produkt ein resultierendes HTML-Dokument zu transformieren.

Mein nächster Schritt ist, dieses Dokument zu übernehmen (oder vielleicht in einem Schritt vor diesem) und den HTML-Code als Text übertragen. Ich habe für eine Weile gesucht, aber kann nicht herausfinden, wie dies zu erreichen. Ich hoffe, es ist etwas einfach, dass ich gerade mit Blick auf, oder kann einfach nicht die magischen Suchbegriffe finden. Kann jemand etwas Hilfe anbieten?

FWIW, ich habe die 5 oder 10 anderen Fragen in SO lesen, die zu umarmen oder ermahnen für diesen mit RegEx, und glaube nicht, dass ich diesen Weg gehen will. Ich brauche den gerenderten Text.

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());
        }
    }
}
War es hilfreich?

Lösung

Da Sie die XML-Quelle haben, sollten Sie eine XSL-Schreiben, dass Sie die Ausgabe, die Sie ohne den Zwischen HTML Schritt wollen geben. Es wäre weitaus zuverlässiger als zu versuchen, die HTML zu transformieren.

Andere Tipps

Dies wird Ihnen nur den Text verlassen:

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

Oder Sie können einen regulären Ausdruck verwenden:

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

Sie so etwas wie diese verwenden können die verwendet Luchs und perl die hTML zu rendern und dann, dass in reinen Text umwandeln?

Dies ist eine große Use-Case für XSL: FO und FOP. FOP nicht nur für PDF-Ausgabe ist, einer der anderen großen Ausgaben, die unterstützt wird, ist Text. Sie sollten ein einfaches Xslt + fo Sheet konstruieren können, die die Spezifikationen hat (das heißt Linienbreite), die Sie wollen.

wird diese Lösung ist ein bisschen Schwergewicht, das nur xml- mit> xslt> Text als ScottSEA vorgeschlagen, aber wenn Sie eine komplexere Formatierungsanforderungen (zB Einrücken), wird es viel einfacher geworden, zum Ausdruck bringen in fo , als in xslt spöttisch auf.

würde ich regexs vermeiden, den Text zum Extrahieren. Das ist zu schwach- und spröde sein garantiert. Wenn Sie nur Text und 80 Charakterlinien wollen, wird die Standard-XSLT-Vorlage nur Element Text drucken. Wenn Sie nur den Text haben, können Sie anwenden, was Textverarbeitung notwendig ist.

übrigens, ich arbeite für eine Firma, die CDA als Teil unseres Produkts (Spracherkennung für -Dikationen) erzeugt. Ich würde schauen in eine XSLT, die die 3.0 direkt in 2,5 umwandelt. In Abhängigkeit von der Treue Sie zwischen den beiden Versionen behalten möchten, wird die vollständige XSLT Route wahrscheinlich die einfachste Wette, wenn, was Sie wirklich wollen, erreichen Konvertierung zwischen den Formaten ist. Das ist, was XSLT wurde, zu tun gebaut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top