Запретить XslCompiledTransform использовать самозакрывающиеся теги

Я использую XslCompiledTransform преобразовать файл XML в HTML. Есть ли способ, которым я могу предотвратить использование самозакрывающихся тегов.

например

<span></span> <!-- I want this even if content empty -->
<span/> <!-- stop doing this! ->

Самозакрывающиеся теги на диапазонах портят мой документ, независимо от того, какой браузер я использую, хотя это допустимый XML, просто у 'span' нет возможности иметь самозакрывающиеся теги.

Есть ли параметр, который я могу вставить в свой xsl или в мой код C#.Net, чтобы предотвратить использование самозакрывающихся тегов?

4 ответа

Хотя я не мог классифицировать это как прямое решение (так как оно не генерирует пустой элемент), я использовал обходной путь, чтобы поместить в элемент пробел (используя xsl:text) - так как это разметка HTML, и если вы активируете стандартный режим (не причуды), дополнительное пространство не меняет отображаемый контент. У меня также не было контроля над вызовом объекта transform.

<div class="clearBoth"><xsl:text> </xsl:text></div>

Единственное решение, которое мне удалось найти, - это добавить логику в файл XSL. В принципе, если элементы, которые я хотел обернуть, пустые, вообще не используйте элемент span.

<xsl:if test="count(jar/beans) > 0">
   <xsl:apply-templates select="jar/beans"/>
</xsl:if>

Не идеально вставлять это везде в мой xsl-файл, чтобы компенсировать тот факт, что, даже если я выберу метод вывода "html", он более чем охотно сгенерирует недопустимый HTML.

Вздох.

В вашем XSLT использовать <xsl:output method="html"/> а затем убедитесь, что ваши элементы HTML-результата, создаваемые таблицей стилей, не находятся в пространстве имен. Кроме того, в зависимости от того, как вы используете XslCompiledTransform в своем коде C#, вам необходимо убедиться, что xsl:output Настройки в таблице стилей соблюдаются. Вы можете легко достичь этого путем преобразования в файл или поток или TextWriter, в этом случае ничего не нужно делать. Однако, если вы по каким-то причинам переходите на XmlWriter, вам нужно убедиться, что он создан с правильными настройками, например

XslCompiledTransform proc = new XslCompiledTransform();
proc.Load("sheet.xsl");

using (XmlWriter xw = XmlWriter.Create("result.html", proc.OutputSettings))
{
  proc.Transform("input.xml", null, xw);
}

Но обычно у вас все будет в порядке, просто трансформируясь в Stream или TextWriter, в этом случае ничего в коде C# не нужно делать для соблюдения метода вывода в таблице стилей.

Ты можешь попробовать<xsl:output method="html"/> Однако результат больше не будет правильно сформированным документом XML.

Или вы можете вызвать метод XslCompiledTransform.Transform(), передав в качестве одного из параметров свой собственный XmlWriter. В вашей реализации вы находитесь под полным контролем и можете реализовать любую необходимую сериализацию дерева результатов.

Другие вопросы по тегам