Запретить XslCompiledTransform использовать самозакрывающиеся теги - PullRequest
7 голосов
/ 23 августа 2011

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

например.

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

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

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

Ответы [ 4 ]

2 голосов
/ 14 ноября 2011

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

<div class="clearBoth"><xsl:text> </xsl:text></div>
0 голосов
/ 23 августа 2011

В вашем 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 # не нужно делать для соблюдения метода вывода в таблице стилей.

0 голосов
/ 25 августа 2011

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

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

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

Sigh.

0 голосов
/ 23 августа 2011

Вы можете попробовать <xsl:output method="html"/>, , однако результат больше не будет корректным XML-документом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...