Подтвердить что ты не робот

Проблема с самозакрывающимися тегами XSLT

Я использую xslt для преобразования xml файла в html. Механизм .net xslt продолжает обслуживать мои самозакрывающиеся теги для пустых тегов.

Пример:

<div class="test"></div> 

становится

<div class="test" />

Первый является действительным html, а последний является незаконным html и делает плохо. Мой вопрос: Как сообщить движку xslt (XslCompiledTransform), чтобы он не использовал самозакрывающиеся теги.

Если это невозможно, как я могу сказать моему браузеру (IE6 + в этом случае) правильно интерпретировать самозакрывающиеся теги.

4b9b3361

Ответ 1

Если вы используете XmlWriter в качестве своего потока вывода, вместо этого используйте HTMLTextWriter. XMLWriter переформатирует вывод HTML обратно в XML.

Ответ 2

Измените свой метод xsl:output как html (вместо xml).

Или добавьте его, если у вас еще нет элемента

<xsl:output method="html"/>

Ответ 3

Обходным путем может быть вставка элемента комментария для принудительного создания неавтоматического закрытия:

<script type="text/javascript" src="nowhere.js">
<xsl:comment></xsl:comment>
</script>

Это не симпатичное решение, но оно работает: -)

/Sten

Ответ 5

Вы не можете сказать, что ваш браузер обрабатывает недействительный 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>

См

и др.

Ответ 6

Для меня это проблема в теге script. Я решил это, заполнив его точкой с запятой (;)

<script type="text/javascript" src="somewhere.js">;</script>

Ответ 7

Я использовал элемент <xsl:text> внутри, например:

<script type="text/javascript" src="/scripts/jquery.js"><xsl:text> </xsl:text></script>

Ответ 8

Есть несколько вещей, которые вам нужно быть осторожными:

  • В вашем использовании xsl < xsl: метод вывода = 'html' >
  • установить OutputSettings в вашем выходе XmlWriter
  • в Html внутри вашего xsl, не устанавливайте атрибуты в теге html, подобном этому < html xmlns = "http://www.w3.org/1999/xhtml" > но используют <html> .

Это часть рабочего кода:

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());

Ответ 9

Просто возникла такая же проблема с 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" />

Ответ 10

Я использую следующее, когда хочу предотвратить самозакрывание элемента:

<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/