Ответ 1
Если вы используете XmlWriter в качестве своего потока вывода, вместо этого используйте HTMLTextWriter. XMLWriter переформатирует вывод HTML обратно в XML.
Я использую xslt для преобразования xml файла в html. Механизм .net xslt продолжает обслуживать мои самозакрывающиеся теги для пустых тегов.
Пример:
<div class="test"></div>
становится
<div class="test" />
Первый является действительным html, а последний является незаконным html и делает плохо. Мой вопрос: Как сообщить движку xslt (XslCompiledTransform), чтобы он не использовал самозакрывающиеся теги.
Если это невозможно, как я могу сказать моему браузеру (IE6 + в этом случае) правильно интерпретировать самозакрывающиеся теги.
Если вы используете XmlWriter в качестве своего потока вывода, вместо этого используйте HTMLTextWriter. XMLWriter переформатирует вывод HTML обратно в XML.
Измените свой метод xsl:output
как html
(вместо xml
).
Или добавьте его, если у вас еще нет элемента
<xsl:output method="html"/>
Обходным путем может быть вставка элемента комментария для принудительного создания неавтоматического закрытия:
<script type="text/javascript" src="nowhere.js">
<xsl:comment></xsl:comment>
</script>
Это не симпатичное решение, но оно работает: -)
/Sten
Это связано с классом XslCompiledTransform
вот обходной путь:
Вы не можете сказать, что ваш браузер обрабатывает недействительный HTML как HTML - вам повезло, что он вообще понимает искаженный HTML.:)
Определенно сделайте это в своей таблице стилей:
<xsl:output method="html"/>
Но если ваш исходный документ имеет пространства имен, это не будет делать трюк. XSLT-процессоры, похоже, молча возвращают метод вывода обратно в XML, если узлы пространства имен присутствуют на выходе.
Вам нужно заменить все экземпляры <xsl:copy-of>
и <xsl:copy>
на создание элементов с помощью только локального имени, например
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
См
и др.
Для меня это проблема в теге script. Я решил это, заполнив его точкой с запятой (;)
<script type="text/javascript" src="somewhere.js">;</script>
Я использовал элемент <xsl:text>
внутри, например:
<script type="text/javascript" src="/scripts/jquery.js"><xsl:text> </xsl:text></script>
Есть несколько вещей, которые вам нужно быть осторожными:
Это часть рабочего кода:
string xmlStr = "<?xml version='1.0' encoding='UTF-8'?><Data></Data>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlStr);
string xslContents = @"
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:msxsl='urn:schemas-microsoft-com:xslt' exclude-result-prefixes='msxsl'>
<xsl:output method='html' version='4.0' omit-xml-declaration='yes' indent='yes'/>
<xsl:template match='Data'>
<html>
<body>
<div></div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>";
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(XmlReader.Create(new StringReader(xslContents)));
StringWriter result = new StringWriter();
using (XmlWriter writer = XmlWriter.Create(result, xsl.OutputSettings))
{
xsl.Transform(doc, null, writer);
}
System.Diagnostics.Debug.Write( result.ToString());
Просто возникла такая же проблема с PHP 5 XSL, с выходом /@method = html. Кажется, что назначение пустого атрибута значения приведет к тому, что элементы будут выводиться как недопустимые несамозакрывающиеся, незамкнутые теги:
<input type="text" name="foo" value="{my-empty-value}" />
приводит к:
<input type="text" name="foo" value="">
Одним из возможных решений является условное добавление атрибута:
<xsl:if test="string-length(my-empty-value) > 0">
<xsl:attribute name="value">
<xsl:value-of select="my-empty-value" />
</xsl:attribute>
</xsl:if>
в результате:
<input type="text" name="foo" />
Я использую следующее, когда хочу предотвратить самозакрывание элемента:
<xsl:value-of select="''" />
Обманывает механизм рендеринга, полагая, что внутри элемента есть контент, и, следовательно, предотвращает самозакрывание.
Это немного уродливое исправление, поэтому я рекомендую его содержать в описательном шаблоне и называть это каждый раз вместо этого:
<xsl:template name="PreventSelfClosure">
<xsl:value-of select="''" />
</xsl:template>
<div class="test">
<xsl:call-template name="PreventSelfClosure"/>
</div>
Затем будет показано следующее:
<div class="test"></div>
http://curtistimson.co.uk/post/xslt/how-to-prevent-self-closing-elements-in-xslt/