2

私はアプリケーションで HTML 出力を頻繁に使用します。これまで、いくつかの単純なルーチンを使用して HTML 文字列を作成してきました。私は今何か違うことを試してみたい:

データを XML にシリアライズし、XSLT テンプレートを提供して Web ブラウザー コントロールの HTML を生成したいと考えています。私はそれを静的に動作させます (XSL の記述をゆっくりと掘り下げます) が、XSL ドキュメントのいくつかの属性をオンザフライで変更する必要があります: フィルター、パスなど、現在の UI の選択に従うようにします。

データは十分小さいので、変更時の XML シリアライゼーションは問題になりません。「静的な」外部 XSL ファイルを (ユーザーが出力をある程度カスタマイズできるように) 使用したいのですが、.

私の質問:

このアイデアは技術的に正しいですか?
XML および XSL ドキュメントを Web ブラウザー コントロールに動的にフィードできますか? XSL で選択したパス要素と属性をオンザフライで (つまり、新しいファイルを生成せずに) 変更できますか? Web ブラウザー コントロールでそれを行う方法は? (私を始めるためのいくつかの指針はいいでしょう..)

[編集]ありがとう、それは働いています:D[/編集]

4

3 に答える 3

7

通常、実行時にトランスフォームにパラメーターを提供し、その動作がパラメーターによって制御されるようにトランスフォームを作成する方法があります。

通常、これを行うときは、1つのパラメーター(XMLドキュメント)のみを渡し、テンプレートにクエリを実行させて、何をすべきかを判断します。したがって、次のようなものが表示されます。

<xsl:template match="*">
   <xsl:variable name="cfg" select="$config/*[name() = current()]"/>
   <xsl:choose>
      <xsl:when test="cfg/elementType = 'option'">
         <xsl:apply-templates select="." mode="option">
      <xsl:when test="cfg/elementType = 'optgroup'">
         <xsl:apply-templates select="." mode="optgroup">
      <xsl:when test="cfg/elementType = 'a'">
         <xsl:apply-templates select="." mode="a">

等々。

XML/XSLTを使用してWebBrowserコントロールに動的にフィードするのは非常に簡単です。

using (XmlWriter xw = XmlWriter.Create(new StringWriter(output)))
{
    StringBuilder output = new StringBuilder();
    XsltArgumentList args = new XsltArgumentList();
    args.AddParam("config", myConfigXml);
    myXslt.Transform(myXml, args, xw);
    xw.Flush();
    myWebBrowser.DocumentText = output.ToString();
}

ユーザーが更新しているUIがWebBrowser自体にある場合(つまり、HTMLページにHTML UIコントロールが含まれている場合)、ページが通常のブラウザーで表示されている場合と同じように、ダイナミックHTML手法を使用する必要があります。それはまったく別のバナナの袋です。

于 2009-01-25T19:16:52.517 に答える
3

XslCompiledTransformparameters、および拡張オブジェクトもサポートしています(どちらも 経由XsltArgumentListです。単純なものについては、パラメーターを使用してみてください。拡張オブジェクトは (想像できる範囲で) より豊富な機能を使用できますが、他の xslt ベンダーへの移植性は高くありません。3 番目のオプションは外部です。オプション用のファイルで、 で変数にロードされますxsl:document

もちろん、勇気があれば、xslt を使用して xslt を動的に記述できますが、簡単ではありません。

WebBrowserほとんどの重要なケースでは、フラット ファイル (%tmp% 領域内) またはローカル Web サーバー (など) に対して使用するのが最も簡単ですHttpListener。html を直接変更すると、コントロールが少し混乱したままになる傾向があります。セキュリティ コンテキスト。

于 2009-01-25T12:20:12.210 に答える
1

あなたのアプリケーションがどのように見えるかはわかりませんので、それが良いアイデアか悪いアイデアかはわかりません。

あなたの他の質問について:

メモリ内のデータを変換して、Web ブラウザ コントロールにロードできます。それ以外の場合は、データを一時ファイルに保存する必要があります。

XSLT パラメータを使用して実行時に選択できます

于 2009-01-25T10:03:33.297 に答える