Запретить 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. В вашей реализации вы находитесь под полным контролем и можете реализовать любую необходимую сериализацию дерева результатов.