XslCompiledTransform и HTML тег <A>
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.09 01:15
Оценка:
Использую 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);


Хотелось бы избавиться от лишнего парсинга.

Что можно попробовать?
Ну, или что я делаю не так?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.