Шаблон html компилируется в приложение как ресурс. фрагмент шаблона HTML выглядит так:
<A href = "%PANELLINK%" target = "_blank">
<IMG border = "0" src = "%PANELIMAGE%" style = "%IMAGESTYLE%">
</A><BR>
%CAPTIONTEXT%
Мне это нравится, потому что более крупный HTML-файл ресурса содержит стили, режим без причуд и т. д.
Но, как всегда, они теперь хотят опустить тег Anchor, если нет ссылки. Также, если заголовок отсутствует, следует опустить тег BR.
Учитывая, что я не хочу создавать целые фрагменты HTML в коде C#, я считается что-то вроде:
%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%-->
Но это просто смешно, плюс один отвечающий напоминает нам, что это тратит впустую полосу пропускания и может содержать ошибки.
Оптовая замена бирок:
%AnchorStartTag%
<IMG border = "0" src = "%PANELIMAGE%" style = "%IMAGESTYLE%">
%AnchorEndTag%%CaptionStuff%
и выполняем поиск-замену, чтобы изменить
%AnchorStartTag%
с участием
"<A href=\"foo\" target=\"blank\""
Я подумал о присвоении идентификатора важным элементам HTML:
<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.
На самом деле у меня есть:
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 в коде - это кошмар. Это кошмар - писать, кошмар, чтобы отлаживать, и кошмар, который нужно поддерживать, - и это усложнит жизнь следующему парню. Я надеюсь на другое решение - так как я являюсь следующий парень.
Я использую механизм шаблонов - это встроенное в язык средство поиска строк. Может быть C, C#, C++, Object pascal, javascript, Java, DelphiScript, Chrome.






Уровень моей репутации в этой игре и без того низкий, что дает мне возможность прямо сказать вам, что вы, сэр или мадам, серьезно нуждаетесь в XSLT. В противном случае (и вы, вероятно, будете) вам нужно посмотреть на XML-литералы в VB.NET (который предоставляет вам решение на основе шаблонов, которое вы ищете ...). Поскольку я предпочитаю оставаться на C# (хотя я родился и вырос на VBA), я использую XSLT.
Обе мои нежелательные рекомендации требуют использования XHTML вместо HTML. Само по себе это требование отталкивает многих традиционных разработчиков. Благодаря тому, что вы используете заглавные буквы в элементах HTML, я уже вижу, что вы сочтете мои замечания совершенно бесполезными. Так что я должен прекратить писать сейчас.
я буду использовать решение на основе xml, как только ситуация начнет использовать xhtml
XHTML вообще не требуется. Смотрите мое решение.
вы получите +1 за XSLT, и я бы дал вам еще один за юмор, если бы мог
+1 для XSLT, один из самых подходящих инструментов для работы ИМХО
У тебя +1 от меня за юмор :). Я дополняю эту мысль аннакатой. Конечно, XSLT - самый мощный, естественный и подходящий инструмент для генерации HTML.
Да, ребята, я с нетерпением жду, когда Microsoft поддержит XSLT 2.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;
}
Я только что обновил свой первоначальный вопрос, у меня есть что-то подобное - и чего-то в этом роде я отчаянно пытаюсь избежать.
Как насчет этого: Сохраните 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%
Это похоже на то, что могло бы сработать, хотя а) xslt не очень удобен для написания веб-разработчиком b) я предполагаю, что мне потребуется два или три дня, чтобы адаптировать его к моей ситуации c) может ли xslt выводить полный html, включая доктайп?
Потому что, хотя я знаком с xslt, я не настолько хорошо разбираюсь в том, что вы написали, - а теперь получасовое изменение происходит на третьем часе.
Похоже, вы нуждаетесь в общем решении, и это самое общее решение для этой задачи. В зависимости от вашей кодовой базы, это займет время для реализации, тем более что вы, кажется, относительно новичок в XSLT. Да, и да, XSLT также может выводить типы документа, если вы ему это скажете.
Хотя я не буду использовать это в данном случае - поскольку у меня нет времени изучать весь XSLT, вероятно, это хорошее решение в целом.
Я бы использовал Набор инструментов для шаблонов, к сожалению, в настоящее время он реализован только в Perl и Python.
test.pl:use Template;
my $template = Template->new({
VARIABLES => {
ImageStyle => "default",
CaptionText => "Place Caption Here"
},
});
$template->process( 'test.tt', {
panel => {
link => "http://Stackoverflow.com/",
image => "/Content/Img/stackoverflow-logo-250.png",
alt => "logo link to homepage"
}
} );
test.tt:
[% IF panel.link -%]
<A href = "[% panel.link %]" alt = "[% panel.alt %]" target = "_blank">
[%- END -%]
[%- IF panel.image -%]
<IMG border = "0" src = "[% panel.image %]" style = "[% ImageStyle %]">
[%- END -%]
[%- IF panel.link %]</A>[% END %]<BR>
[% CaptionText %]
<A href = "http://Stackoverflow.com/" alt = "logo link to homepage" target = "_blank"> <IMG border = "0" src = "/Content/Img/stackoverflow-logo-250.png" style = "default"> </A><BR> Place Caption Here
Если переменная panel.link не определена, теги привязки пропускаются.
<IMG border = "0" src = "/Content/Img/stackoverflow-logo-250.png" style = "default"> <BR> Place Caption Here
Я не могу заставить это выделить так, как я хочу.
Используйте шаблонизатор, например эти.
Шаблоны - это серьезный запах кода. Посмотрите, как Seaside генерирует html.
[Edit] Еще один, где кто-то без понятия проголосовал против.
Что ж, ваш ответ немного краток, вы можете подробно рассказать, что это DSL, шаблон компоновщика, что на нем работают рефакторинги и т. д. :)
Это не совсем языковой агностик. Лучший способ зависит от используемого вами шаблонизатора.