Почему XslCompiledTransform добавляет метатег в вывод HTML? - PullRequest
4 голосов
/ 10 декабря 2010

Я использую этот код для преобразования XML в HTML с использованием шаблона XSLT:

string uri = Server.MapPath("~/template.xslt");
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(uri);
XDocument xml = new XDocument(new XElement("Root"));
StringBuilder builder = new StringBuilder();
XmlReader reader = xml.CreateReader();
XmlWriter writer = XmlWriter.Create(builder, xsl.OutputSettings);
xsl.Transform(reader, writer);
writer.Close();

Мой шаблон выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<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" indent="yes"  />
<xsl:template match="Root">
    <html>
       <head>...

Вывод правильный, но содержит метатег. Как отключить преобразование, чтобы оно не генерировало метатег?

Ответы [ 4 ]

5 голосов
/ 10 декабря 2010

Краткий ответ :

Использование :

<xsl:output method="xml"/>

Это исключает любые добавленные теги HTML, такие как <meta>.

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

В XSLT 2.0 можно использовать :

<xsl:output method="xhtml"/>
4 голосов
/ 10 декабря 2010

Спецификация XSLT 1.0 для метода вывода = "html" (http://www.w3.org/TR/xslt#section-HTML-Output-Method) требует, чтобы метаэлемент выводился, если в результирующем дереве есть раздел заголовка:

Если есть элемент HEAD, то Метод вывода html должен добавить META элемент сразу после начальный тег элемента HEAD указание кодировки символов фактически используется.

Итак, XslCompiledTransform делает то, что должен делать процессор XSLT. Если вам не нужен метаэлемент, вам нужно более подробно объяснить, какой именно вывод вы хотите получить, или почему мета является проблемой, если вы хотите вывод html. Конечно, вы могли бы использовать output method = "xml", таким образом, вы не получите метаэлемент, но я не уверен, что результатом сериализации будет то, что вы хотите для таких вещей, как узлы 'br'.

1 голос
/ 11 апреля 2011

Это также зависит от типа документа, который вы вставляете из выходного тега. Например, при использовании XHTML мета-тег пропускается.

   <xsl:output method="html"
               doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
               doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
0 голосов
/ 27 марта 2012

если вы хотите вывод html без добавления тега MATE, просто добавьте пространство имен xml в тег html следующим образом

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...