Question

Mon objectif est de créer un moteur qui exploite les derniers documents CDA HL7 3.0 et les rend rétro-compatible avec HL7 2.5, une bête radicalement différente.

Le document CDA est un fichier XML qui, lorsqu'il est associé à son fichier XSL correspondant, permet d'afficher un document HTML pouvant être affiché par l'utilisateur final.

Dans HL7 2.5, je dois obtenir le texte restitué, dépourvu de balise, et le replier en un flux de texte (ou similaire) que je peux écrire en 80 lignes de caractères pour remplir le message HL7 2.5.

Jusqu'à présent, j'utilise l'approche XslCompiledTransform pour transformer mon document XML à l'aide de XSLT et produire un document HTML résultant.

Mon étape suivante consiste à prendre ce document (ou peut-être à une étape antérieure) et à rendre le code HTML sous forme de texte. J'ai cherché pendant un moment, mais je n'arrive pas à comprendre comment accomplir cela. J'espère que c'est quelque chose de facile que je néglige ou que je ne trouve pas les termes de recherche magiques. Quelqu'un peut-il offrir de l'aide?

FWIW, j’ai lu les 5 ou 10 autres questions de SO qui embrassent ou recommandent d’utiliser RegEx pour cela, et je ne pense pas que je veuille aller dans cette direction. J'ai besoin du texte rendu.

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());
        }
    }
}
Était-ce utile?

La solution

Puisque vous avez la source XML, pensez à écrire un fichier XSL qui vous donnera le résultat souhaité sans l'étape HTML intermédiaire. Ce serait beaucoup plus fiable que d'essayer de transformer le code HTML.

Autres conseils

Cela ne vous laissera que le texte:

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

Ou vous pouvez utiliser une expression régulière:

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

Pouvez-vous utiliser quelque chose comme this qui utilise Lynx et Perl pour restituer le code HTML, puis le convertir en texte brut?

C’est un excellent cas d’utilisation pour XSL: FO et FOP. La FOP ne concerne pas uniquement la sortie PDF, mais le texte est l'un des principaux résultats pris en charge. Vous devriez être capable de construire une simple feuille de style xslt + fo ayant les spécifications (c'est-à-dire l'épaisseur de trait) souhaitées.

Cette solution est un peu plus lourde que d'utiliser simplement xml - > xslt - > text comme ScottSEA l'a suggéré, mais si vous avez des exigences de formatage plus complexes (par exemple, indentation), deviendra beaucoup plus facile à exprimer en fo que de se moquer de xslt.

J'éviterais les regex pour extraire le texte. C'est un niveau trop bas et garanti pour être fragile. Si vous souhaitez uniquement du texte et 80 lignes de caractères, le modèle xslt par défaut imprimera uniquement le texte de l'élément. Une fois que vous n’avez plus que le texte, vous pouvez appliquer le traitement de texte nécessaire.

Incidemment, je travaille pour une entreprise qui produit des CDA dans le cadre de notre produit (reconnaissance vocale pour les indications). Je voudrais regarder dans un XSLT qui transforme le 3.0 directement en 2.5. En fonction de la fidélité que vous souhaitez conserver entre les deux versions, la route XSLT complète sera probablement votre meilleur choix si vous souhaitez réellement obtenir une conversion entre les formats. C’est pour cela que XSLT a été conçu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top