Pergunta

O meu objetivo é construir um motor que leva a mais recente HL7 3.0 documentos CDA e torná-los compatíveis com HL7 2.5, que é um animal totalmente diferente.

O documento CDA é um arquivo XML que quando emparelhado com o seu arquivo XSL correspondência torna um ajuste documento HTML para exibição para o usuário final.

Em HL7 2.5 Eu preciso para obter o texto processado, desprovido de qualquer marcação, e dobrá-lo em um fluxo de texto (ou similar) que eu posso escrever em 80 linhas de caracteres para preencher a mensagem HL7 2.5.

Até agora, eu estou tomando uma abordagem de usar XslCompiledTransform para transformar meu documento XML usando XSLT e produto um documento HTML resultante.

Meu próximo passo é levar esse documento (ou talvez em um passo antes de este) e tornar o HTML como texto. Tenho procurado por um tempo, mas não consigo descobrir como fazer isso. Eu estou esperando o seu algo fácil que eu estou com vista, ou apenas não pode encontrar os termos de pesquisa mágicas. Alguém pode oferecer alguma ajuda?

FWIW, eu li os outros 5 ou 10 perguntas de SO que abraço ou admoestar usando RegEx para isso, e não acho que eu quero ir por esse caminho. Eu preciso do texto processado.

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());
        }
    }
}
Foi útil?

Solução

Uma vez que você tem a fonte XML, considere escrever um XSL que lhe dará o resultado que você quer sem a etapa intermediária HTML. Seria muito mais confiável do que tentar transformar o HTML.

Outras dicas

Isso vai deixar você com apenas o 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>";
}

Ou você pode usar uma expressão 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;
}

Você pode usar algo como este que usa lince e perl para processar o html e depois convertê-lo em texto puro?

Este é um grande caso de uso para XSL: FO e FOP. FOP não é apenas para a saída de PDF, uma das outras saídas principais que é suportado é texto. Você deve ser capaz de construir um xslt simples + fo estilo que tem as especificações (ou seja, linha de largura) que você deseja.

Esta vontade solução é um pouco mais pesado de peso que apenas usando em XML> XSLT-> texto como ScottSEA sugerido, mas se você tiver quaisquer requisitos de formatação mais complexas (por exemplo, recuo), ele se tornará muito mais fácil de expressar em fo , que zombando-se em XSLT.

Gostaria de evitar regexs para extrair o texto. Isso é muito baixo nível e garantida a ser frágil. Se você quiser apenas linhas de texto e 80 caracteres, o modelo XSLT padrão só irá imprimir elemento de texto. Uma vez que você tem apenas o texto, você pode aplicar qualquer processamento de texto é necessário.

A propósito, o trabalho I para uma empresa que produz CDAs como parte do nosso produto (reconhecimento de voz para dicátions). Gostaria de olhar para um XSLT que transforma o 3.0 diretamente em 2,5. Dependendo da fidelidade você deseja manter entre as duas versões, a rota XSLT completo será, provavelmente, a sua aposta mais fácil se o que você realmente deseja alcançar é a conversão entre os formatos. Isso é o que XSLT foi construído para fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top