Вопрос

Моя цель — создать движок, который будет использовать новейшие документы CDA HL7 3.0 и сделать их обратно совместимыми с HL7 2.5, который радикально отличается от других.

Документ CDA представляет собой XML-файл, который в сочетании с соответствующим ему файлом XSL отображает HTML-документ, пригодный для отображения конечному пользователю.

В HL7 2.5 мне нужно получить визуализированный текст, лишенный какой-либо разметки, и сложить его в текстовый поток (или аналогичный), который я могу записать в 80-символьных строках для заполнения сообщения HL7 2.5.

До сих пор я использовал подход XslCompiledTransform для преобразования моего XML-документа с помощью XSLT и создания результирующего HTML-документа.

Мой следующий шаг — взять этот документ (или, возможно, на предыдущем этапе) и отобразить HTML как текст.Я искал некоторое время, но не могу понять, как это сделать.Я надеюсь, что это что-то простое, что я просто не замечаю или просто не могу найти волшебные условия поиска.Может ли кто-нибудь предложить помощь?

Кстати, я прочитал 5 или 10 других вопросов в SO, которые поддерживают или предостерегают от использования RegEx для этого, и не думаю, что я хочу пойти по этому пути.Мне нужен визуализированный текст.

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());
        }
    }
}
Это было полезно?

Решение

Поскольку у вас есть источник XML, рассмотрите возможность написания XSL, который даст вам желаемый результат без промежуточного этапа HTML.Это было бы гораздо надежнее, чем пытаться преобразовать HTML.

Другие советы

В результате у вас останется только текст:

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

Или вы можете использовать регулярное выражение:

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

Можете ли вы использовать что-то вроде этот который использует lynx и perl для рендеринга HTML, а затем преобразует его в обычный текст?

Это отличный вариант использования XSL:FO и FOP. ФОП предназначен не только для вывода в формате PDF, одним из других основных поддерживаемых выходных данных является текст.Вы должны быть в состоянии создать простую таблицу стилей xslt + fo со спецификациями (т.ширина линии), которую вы хотите.

Это решение будет немного более тяжелым, чем простое использование xml->xslt->text, как предложил ScottSEA, но если у вас есть более сложные требования к форматированию (например,отступы), то выражать в fo станет гораздо проще, чем макетировать в xslt.

Я бы избегал регулярных выражений для извлечения текста.Это слишком низкий уровень и гарантированно будет хрупким.Если вам нужен только текст и строки из 80 символов, шаблон xslt по умолчанию будет печатать только текст элемента.Если у вас есть только текст, вы можете применить любую необходимую обработку текста.

Я, кстати, работаю в компании, которая производит CDA в рамках нашего продукта (распознавание голоса для показаний).Я бы рассмотрел XSLT, который преобразует версию 3.0 непосредственно в версию 2.5.В зависимости от точности, которую вы хотите сохранить между двумя версиями, полный маршрут XSLT, вероятно, будет вашим самым простым выбором, если вы действительно хотите добиться преобразования между форматами.Именно для этого и был создан XSLT.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top