3

HTML テンプレートはリソースとしてアプリケーションにコンパイルされます。HTML テンプレートのフラグメントは次のようになります。

<A href="%PANELLINK%" target="_blank">
   <IMG border="0" src="%PANELIMAGE%" style="%IMAGESTYLE%">
</A><BR>
%CAPTIONTEXT%

より大きなリソース HTML ファイルにはスタイリング、癖のないモードなどが含まれているため、このように気に入っています。

しかし、いつものように、リンクがない場合はアンカータグを省略するオプションが必要です。また、キャプションがない場合は、BR タグを省略してください。


考慮されたテクニックNº1

C# コードで HTML フラグメント全体を作成する必要がないことを考えると、次のようなことを考えました。

%ANCHORSTARTTAGPREFIX%<A href="%PANELLINK%" target="_blank">%ANCHORSTARTTAGPOSTFIX%
   <IMG border="0" src="%PANELIMAGE%" style="%IMAGESTYLE%">
%ANCHORENDTAGPREFIX%</A>%ANCHORENDTAGPOSTFIX%CAPTIONPREFIX%<BR>
%CAPTIONTEXT%%CAPTIONPOSTFIX%

プレフィックスとポストフィックスを使用して HTML コードを次のように変換できるという考えで:

<!--<A href="%PANELLINK%" target="_blank">-->
   <IMG border="0" src="%PANELIMAGE%" style="%IMAGESTYLE%">
<!--</A>--><!--<BR>
%CAPTIONTEXT%-->

しかし、それはばかげているだけでなく、帯域幅を浪費し、バグが発生する可能性があることを 1 人の回答者が思い出させてくれます。


考慮されたテクニックNº2

タグの卸売交換:

%AnchorStartTag%
   <IMG border="0" src="%PANELIMAGE%" style="%IMAGESTYLE%">
%AnchorEndTag%%CaptionStuff%

そして、変更するために検索置換を行う

%AnchorStartTag%

"<A href=\"foo\" target=\"blank\""

考慮されたテクニックNº3

重要な HTML 要素に ID を与えることを検討しました。

<A id="anchor" href="%PANELLINK%" target="_blank">
   <IMG border="0" src="%PANELIMAGE%" style="%IMAGESTYLE%">
</A><BR id="captionBreak">
%CAPTIONTEXT%

次に、HTML DOM パーサーを使用してプログラムでノードを削除します。しかし、信頼できる HTML DOM パーサーに簡単にアクセスすることはできません。HTML が代わりに xhtml である場合、さまざまな組み込み/ネイティブで利用可能な xml DOM パーサーを使用します。


考慮されたテクニックNº4

私が実際にこれまでに持っているものは次のとおりです。

private const String htmlEmptyTemplate = 
    @"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN\"""+Environment.NewLine+
    @"   ""http://www.w3.org/TR/html4/strict.dtd"">"+Environment.NewLine+
    @"<HTML>"+Environment.NewLine+
    @"<HEAD>"+Environment.NewLine+
    @"  <TITLE>New Document</TITLE>"+Environment.NewLine+
    @"  <META http-equiv=""X-UA-Compatible"" content=""IE=edge"">"""+Environment.NewLine+
    @"  <META http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"">"+Environment.NewLine+
    @"</HEAD>"+Environment.NewLine+
    @""+Environment.NewLine+
    @"<BODY style=""margin: 0 auto"">"+Environment.NewLine+
    @"  <DIV style=""text-align:center;"">"+Environment.NewLine+
    @"      %ContentArea%"+Environment.NewLine+
    @"  </DIV>" + Environment.NewLine +
    @"</BODY>" + Environment.NewLine +
    @"</HTML>";

private const String htmlAnchorStartTag = 
    @"<A href=""%PANELLINK%"" target=""_blank"">";

//Image is forbidden from having end tag
private const String htmlImageTag = 
    @"<IMG border=""0"" src=""%PANELIMAGE%"" style=""%IMAGESTYLE%"">";

private const String htmlCaptionArea =
    @"<BR>%CAPTIONTEXT%";

そして、私はすでに眼球を抉り出したいです。コードで HTML を作成するのは悪夢です。書くのも、デバッグするのも、維持するのも悪夢です。そして、次の人にとっては大変なことになるでしょう。私は次の人なので、別の解決策を望んでいます。

4

6 に答える 6

11

このゲームでの私の評判ポイントはすでに低いため、あなた、または奥様が XSLT を真剣に必要としていることを率直に伝えることができます。これに失敗した場合 (おそらくそうなるでしょう)、VB.NET でXML リテラルを調べる必要があります (これにより、探しているテンプレート ベースのソリューションが提供されます...)。私は C# にとどまることを好むので (私は VBA で生まれ育ちましたが)、XSLT を使用します。

私の歓迎されない推奨事項はどちらも、HTML の代わりに XHTML を使用する必要があります。この要件だけでも、多くの従来型の開発者にとってはまったく気が進まないものです。HTML要素に大文字を使用していることから、私の発言がまったく役に立たないことがわかるでしょう。だから今は書くのをやめるべきです。

于 2008-12-17T20:48:02.477 に答える
2

これらのいずれかのようなテンプレート エンジンを使用します。

于 2008-12-17T23:12:36.647 に答える
2

これはどうですか: XML をフラグメントとして保存します。

<fragment type="link_img_caption">
  <link href="%PANELLINK%" />
  <img src="%PANELIMAGE%" style="%IMAGESTYLE%" />
  <caption text="%CAPTIONTEXT%" />
</fragment>

それを引き出し、プレースホルダーを「実際の」文字列(もちろん慎重にXMLエスケープしたもの)に置き換えます。

...そして、単純な XML 変換を使用して HTML 出力を生成します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" version="4.0" encoding="iso-8859-1" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="fragment" />
  </xsl:template>

  <xsl:template match="fragment[@type = 'link_img_caption']">
    <xsl:choose>
      <xsl:when test="link[@href != '']">
        <a href="{link/@href}" target="_blank">
          <img src="{img/@src}" style="{img/@style}" border="0" />
        </a>
      </xsl:when>
      <xsl:otherwise>
        <img src="{img/@src}" style="{img/@style}" border="0" />
      </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="caption[@text !='']">
      <br />
      <xsl:value-of select="caption/@text" />
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

属性により、他のフラグメント タイプを追加できtypeます。これには改善の余地がたくさんあるので、それをどのように行うかの例として見てください

出力:

<a href="%PANELLINK%" target="_blank">
  <img src="%PANELIMAGE%" style="%IMAGESTYLE%" border="0">
</a>
<br>
%CAPTIONTEXT%

また、リンクの href が XML で空の場合:

<img src="%PANELIMAGE%" style="%IMAGESTYLE%" border="0">
<br>
%CAPTIONTEXT%
于 2008-12-17T21:06:38.430 に答える
0

1.) コメントを使用しないでください。不要なデータがブラウザに送信され、帯域幅が浪費され、IE でバグが発生します。

2.) ある種の方法としては、これの方がよいのではないでしょうか? (私は C# に詳しくありません) しかし、このようなものは私にとってより理にかなっています。

//using PHP in this example
function HTMLImage($imageData, $linkData){
  var str = '';
  //if there is link data, start <a> tag
  $str .= '<a '.{expand any attributes}.'>';

  //add image tag and attributes from $imageData
  $str .= '<img '.{expand any attributes}.'/>';

  //if there is link data, close <a> tag
  $str .= '</a>';
  return $str;
}
于 2008-12-17T20:48:53.050 に答える
0

テンプレートは深刻なコード臭です。Seaside が html を生成する方法を見てみましょう。

[編集] 手がかりのない誰かが反対票を投じた別のもの。

于 2008-12-24T21:20:06.600 に答える