2

私の目標は、最新のHL7 3.0 CDAドキュメントを取得し、根本的に異なる獣であるHL72.5と下位互換性を持たせるエンジンを構築することです。

CDAドキュメントはXMLファイルであり、対応するXSLファイルと組み合わせると、エンドユーザーへの表示に適したHTMLドキュメントになります。

HL7 2.5では、マークアップのないレンダリングされたテキストを取得し、それをテキストストリーム(または同様のもの)に折りたたんで、HL72.5メッセージに入力するために80文字行で書き出す必要があります。

これまでのところ、XslCompiledTransformを使用してXSLTを使用してXMLドキュメントを変換し、結果のHTMLドキュメントを生成するというアプローチを取っています。

私の次のステップは、そのドキュメントを(またはおそらくこれより前のステップで)取得し、HTMLをテキストとしてレンダリングすることです。しばらく検索しましたが、どうすればいいのかわかりません。見落としている、または魔法の検索用語が見つからないような簡単なものを望んでいます。誰かが助けを提供できますか?

FWIW、私はSOで他の5つまたは10の質問を読みました。これは、このために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());
        }
    }
}
4

5 に答える 5

3

XMLソースがあるので、中間のHTMLステップなしで必要な出力を提供するXSLを作成することを検討してください。HTMLを変換しようとするよりもはるかに信頼性が高くなります。

于 2009-06-26T21:53:03.933 に答える
2

これにより、テキストだけが残ります。

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>";
}
于 2009-06-26T19:25:26.057 に答える
1

または、正規表現を使用できます。

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;
}
于 2009-06-26T20:09:15.690 に答える
0

lynxとperlを使用してhtmlをレンダリングし、それをプレーンテキストに変換するこのようなものを使用できますか?

于 2009-06-26T20:12:46.790 に答える
0

これは、XSL:FOおよびFOPの優れたユースケースです。 FOPはPDF出力だけでなく、サポートされている他の主要な出力の1つはテキストです。必要な仕様(つまり、線幅)を持つ単純なxslt+foスタイルシートを作成できるはずです。

このソリューションは、ScottSEAが提案したようにxml-> xslt-> textを使用するよりも少し重いですが、より複雑なフォーマット要件(インデントなど)がある場合は、モックするよりもfoで表現する方がはるかに簡単になります。 xsltでアップします。

私はテキストを抽出するためのregexを避けます。それは低レベルであり、もろいことが保証されています。テキストと80文字の行だけが必要な場合、デフォルトのxsltテンプレートは要素テキストのみを印刷します。テキストだけができたら、必要なテキスト処理を適用できます。

ちなみに、私は製品の一部としてCDAを製造している会社で働いています(ジカチオンの音声認識)。3.0を直接2.5に変換するXSLTを調べます。2つのバージョン間で維持したい忠実度にもよりますが、本当に達成したいのがフォーマット間の変換である場合は、完全なXSLTルートがおそらく最も簡単な方法です。それがXSLTが行うために構築されたものです。

于 2009-06-29T17:09:44.403 に答える