Использую XslCompiledTransform для того чтобы трансформировать RSDN ML (формат в которых размещаются статьи на этом сайте) в HTML.
Все бы хоршо, но в получающемся HTML-е теги <A> не имеющие содержимого превращаются в <A ... />. Броузеры воспринимают это дело совершенно потрясно — делают одну большую ссылку на весь файл.
Нужно: Сделать так, чтобы даже пустые теги <A> превращались в <A ... ><A/>, а не в <A ... />. Например, вместо:
<A href="printv.asp?what=this" />
<A name="ID0E5" /A>
чтобы было
<A href="printv.asp?what=this"></A>
<A name="ID0E5"></A>
Сейчас выкручиваюсь не очень красивым образом. Гружу полученный XML в XLinq и тупо добавляю XText("") во все "пустые" теги <A>.
Вот код трансформации и записи в файл:
def xslt = Xml.Xsl.XslCompiledTransform(true);
xslt.Load(typeof(RsdnMlXslt)); // используется прекомпилированный шаблон
def sbOut = Text.StringBuilder();
// трансформация не генерирует шапку HTML-ч, так что докидываем ее вручную (в виде строки)
_ = sbOut.AppendLine($<#<HTML>
<HEAD>
<TITLE>$title</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<LINK rel="stylesheet" type="text/css" href="http://rsdn.ru/css/article.css" />
</HEAD>
#>);
def settings = Xml.XmlWriterSettings(); // так как генерируется фрагент, нужно задать это в опциях...
settings.ConformanceLevel = Xml.ConformanceLevel.Fragment;
def outWriter = Xml.XmlWriter.Create(sbOut, settings);
xslt.Transform(rsdnMlFilePath, outWriter); // трасформируем...
_ = sbOut.AppendLine("</HTML>"); // закрываем тег HTML
def outFilePath = ChangeExtension(rsdnMlFilePath, "html"); // мелкая хим
// А вот от этого хотелось бы избавиться!
// Это загрузка в XDocument и последующая императивная модификация пустых тегов!
def outDoc = XDocument.Load(IO.StringReader(sbOut.ToString()));
foreach (e in outDoc.Descendants(XName.Get("A")).Where(x => !x.HasElements))
e.Add(XText(""));
outDoc.Save(outFilePath); // запись в файл.
// Хотелось бы обойтись этим кодом (вместо возни с XDocument):
//IO.File.WriteAllText(outFilePath, sbOut.ToString(), Text.Encoding.UTF8);
Хотелось бы избавиться от лишнего парсинга.
Что можно попробовать?
Ну, или что я делаю не так?