質問
私の目標は、最新のHL7 CDA 3.0文書を受け取り、根本的に異なる獣であるHL7 2.5と彼らは後方互換性を持たせるエンジンを構築することです。
CDA文書には、その一致するXSLファイルとペアXMLファイルには、エンドユーザーに表示するためのHTML文書のフィット感をレンダリングしている。
HL7 2.5で、私は、任意のマークアップを欠いてレンダリングされたテキストを取得し、私はHL7 2.5メッセージを投入するために80文字行に書き出すことができますテキストストリーム(または類似)にそれを折るする必要があります。
これまでのところ、私はXSLTや製品に結果のHTMLドキュメントを使用して、私のXML文書を変換するためにXslCompiledTransformではを使用してのアプローチを取っている。
私の次のステップは、その文書を取る(または多分この前段階で)、およびテキストとしてHTMLをレンダリングすることです。私はしばらくの間、検索しましたが、これを達成する方法を見つけ出すことはできません。私はちょうど見下ろすてるか、単に魔法の検索用語を見つけることができないということは容易にその何かを願っています。誰もがいくつかの助けを提供することはできますか?
FWIW、私は受け入れるか、このために正規表現を使用して戒めるSOで5つのまたは10他の質問を読んで、私はその道を行きたいとは思いません。私は、レンダリングされたテキストを必要とします。
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());
}
}
}
解決
、中間HTML工程なしあなたが望む出力を与えるXSLを書くことを検討してください。これは、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(" ", " ");
htmlText = htmlText.Replace("&", "&");
return htmlText;
}
これは、XSLのための偉大なユースケースである:FOとFOP。ちょうどPDF出力のためではありませんの FOPは、サポートされている他の主要な出力のうちの一つは、テキストです。あなたが望む仕様(すなわち線幅)を持っているスタイルシートfoはシンプルなXSLT +を構築することができる必要があります。
ScottSEAが示唆されていますが、任意のより複雑なフォーマット要件(例えばインデント)を持っている場合、それはFOで表現する方がはるかに簡単になるようにこのソリューションは、意志だけXML-> xslt->テキストを使用して、もう少し重いです、XSLTでモックアップよります。
私はテキストを抽出するためregexsを避けるだろう。それはあまりにも低レベルと脆性であることが保証さです。あなただけのテキストと80文字の行をしたい場合は、デフォルトのXSLTテンプレートは要素のテキストを印刷します。あなたはテキストのみを持っていたら、あなたは必要であるものは何でもテキスト処理に適用することができます。
ちなみに、私は、私たちの製品(ジカチオンのための音声認識)の一環として、CDAのを製造する会社のために働きます。私は2.5に直接3.0を変換するXSLTになります。あなたが本当に達成したいことはフォーマット間の変換である場合は、2つのバージョン間維持したい忠実度に応じて、完全なXSLTルートは、おそらくあなたの最も簡単な賭けになります。これは、XSLTを行うために建てられたものです。