2009-08-12 1 views
4

、次のコードを書くより速く、より簡潔な方法がある:ASP.NETでXSLT変換を実行する最も合理的な方法は何ですか?つまり

//Create an object for performing XSTL transformations 
XslCompiledTransform xslt = new XslCompiledTransform(); 
xslt.Load(HttpContext.Current.Server.MapPath("/xslt/" + xsltfile.Value), new XsltSettings(true, false), new XmlUrlResolver()); 

//Create a XmlReader object to read the XML we want to format 
//XmlReader needs an input stream (StringReader) 
StringReader sr = new StringReader(node.OuterXml); 
XmlReader xr = XmlReader.Create(sr); 

//Create a StringWriter object to capture the output from the XslCompiledTransform object 
StringWriter sw = new StringWriter(); 

//Perform the transformation 
xslt.Transform(xr, null, sw); 

//Retrieve the transformed XML from the StringWriter object 
string transformedXml = sw.ToString(); 

はUPDATE(すべての答えてくれてありがとう今のところ!):

私の曖昧さのため申し訳ありません

: "でより速く "より簡潔に" 私は何か不必要なステップを含んでいますか?また、私は誰かが持っているより多くの "可読な"解が好きです。私は開発中のWebアプリケーションの小さな部分でこのコードを使用していますが、アプリケーションの大部分に移動しようとしていますので、移動前にできるだけ素敵なものにしておきたい。

また、データベースと通信する(別のデータアクセスクラスライブラリ内の)静的クラスからXMLを取得します。また、変換されたXML文字列を操作してWebページに出力します。この場合、入力/応答ストリームがまだ有効かどうかはわかりません。

もう1つ:XMLとXSLTが変更される可能性があります(アプリケーションのユーザーは両方を変更できます)ので、毎回コンパイルする必要があります。

+0

おそらく上記のコードを書くより読みやすい方法があると思いますが、そこには必須のステップがあります。私はあなたが「速い」とはどういう意味か分かりません。 – Lee

+0

xmlがクライアント側に表示されるように変換する場合は、asp:XMLコントロールを使用していない理由がありますか?変換された文字列を表示する方が簡単ですが、ブラウザ側でどのように使用しているのか分かりません。 http://msdn.microsoft.com/en-us/library/63cbk9e7(VS.85).aspx –

+0

@Jim asp:XMLコントロールは古くて遅いXslTransformクラスを使用しているため非難されています - http://を参照してくださいwww.tkachenko.com/blog/archives/000513.html恥ずべきものだった。 –

答えて

11

は、私はあなたに非常に似ている私のASP.NET、のためにしたコードですこのようなコードを書き直すのは、それぞれのコードブロックが1つの唯一の目的を持つからです。これにより、読みやすく理解しやすくなります。さらに、関数の名前とそのパラメーターから多くの情報を推測できるため、コードのコメントが少なくて済みます。

+0

XmlReaderおよびStreamReaderを破棄していません。 –

2

あなたはASP.NETに言及しているので、問題はあなたの変換出力のために、それがPOSTである場合は、直接入力ストリームを使用できるかどうかを直接応答ストリームを使用できるかどうかです...

7

あなたがしている場合大きなXSLTを使用すると、プロジェクトをビルドするとき(例:ビルド後のステップ)にXSLTを.NETアセンブリにコンパイルすることで、実行時にコンパイルするオーバーヘッドを節約できます。これを行うには、コンパイラは、あなたが機能だった(の.NET Framework 2.0 SP1が必要か、以降のサーバにインストールするよう、プリコンパイルされたXSLTをロードするためにxsltc.exe呼ばおよびVisual Studioの一部2008

ですSP1で導入されました)。例えば

アントンLapounovのブログ記事をチェック:XSLTを事前にコンパイルするように、それがロードされた後、あなたがキャッシュXslCompiledTransformを検討すべき選択肢ではない場合

XSLTC — Compile XSLT to .NET Assembly

を変換を実行するたびにコンパイルする必要はありません。

string path = HttpContext.Current.Server.MapPath("/xslt/" + xsltfile.Value); 
XmlReader reader = CreateXmlReader(node.OuterXml); 
string transformedXml = Transform(path, reader); 

private XmlReader CreateXmlReader(string text) 
{ 
    StringReader reader = new StringReader(text); 
    return XmlReader.Create(reader); 
} 

private string Transform(string xsltPath, XmlReader source) 
{ 
    XsltCompiledTransform transformer = new XsltCompiledTransform(); 
    transformer.Load(
     xsltPath, 
     new XsltSettings(true, false), 
     new XmlUrlResolver()); 

    StringWriter writer = new StringWriter(); 
    transformer.Transform(source, null, writer); 
    return writer.ToString(); 
} 

理由は、私がしたい:私はこのようなコードを書き換えると思い

XDocument xDoc = XDocument.Load("output.xml"); 

     XDocument transformedDoc = new XDocument(); 
     using (XmlWriter writer = transformedDoc.CreateWriter()) 
     { 
      XslCompiledTransform transform = new XslCompiledTransform(); 
      transform.Load(XmlReader.Create(new StreamReader("books.xslt"))); 
      transform.Transform(xDoc.CreateReader(), writer); 
     } 

     // now just output transformedDoc 
0

:ここ

+0

-1を使用しない場合。 –

+0

@John私のコードで決定的な処理が必要ですか?私がディスクファイルで作業していた場合、XmlReaderの作成についてusingステートメントを記述することは理解できましたが、この場合はガベージコレクタに処理させることがうまくいくとは感じませんでした。読みやすさのために – Lee

+0

+1;ご協力いただきありがとうございます。私は別の "XMLHelper"クラスを持っています。これは、Webアプリケーション全体で使用している一般的なユーティリティです。これらのメソッドはそこに非常にうまく統合されるかもしれません。 – attack

2

は完全な例をする時間を持っていないが、いくつかの注意事項:

  1. XMLが可能System.Stringと同じではありません。XDocumentまたはXmlDocumentとしてクラスライブラリから取得します。それをXDocumentまたはXmlDocumentとして処理します。
  2. ASP.NET Cacheを使用すると、.XSLTファイルが変更されたときにキャッシュに依存する、コンパイル済みのXSLを格納できます。
  3. XMLを文字列に変換してからXMLに戻しません。 node.CreateNavigator().ReadSubTree()を使用してください。
  4. 同様に、XPathNavigator.AppendChildを使用してXmlWriterを取得し、XMLドキュメントに書き込みます。
+0

ヒントをありがとう、申し訳ありませんが、私は少し混乱しています。私はXMLから文字列に変換して、それをページに直接配置しています。私はXMLに変換していないし、XMLを変更していない。あなたは私が文字列を全く避けるべきだと言いました。変換されたXMLをWebページに直接植え付ける必要がある場合は、文字列に変換せずにXMLを行う方法がありますか? – attack

+1

XMLをWebページに「植え付ける」のはどうですか?代わりに、 'XmlDocument.WriteTo(Response.OutputStream)'または同等のものを使用してください。 –

関連する問題