为什么XslCompiledTransform会向HTML输出添加META标签?

5
我使用这段代码来使用XSLT模板将XML转换为HTML:
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>...

输出结果是正确的,但包含META标签。如何禁用转换,以便不生成META标签?

4个回答

5

简短回答:

用途:

<xsl:output method="xml"/>

这将消除任何添加的HTML标签,例如<meta>

同时,您可能难以实现某些元素的确切所需词汇表示。

XSLT 2.0中可以使用以下方法:

<xsl:output method="xhtml"/>

4
XSLT 1.0规范中的output method="html" (http://www.w3.org/TR/xslt#section-HTML-Output-Method)要求,如果结果树中有head部分,则必须输出一个meta元素:

如果存在HEAD元素,则html输出方法应在HEAD元素的开始标记之后立即添加一个META元素,指定实际使用的字符编码。

因此,XslCompiledTransform执行了XSLT处理器应该执行的操作。如果您不想要meta元素,则需要更详细地解释您需要的输出类型或者为什么meta是问题(如果您需要html输出)。当然,您可以使用output method="xml",这样就不会得到meta元素,但我不确定这种序列化方式是否适用于像'br'元素节点等内容。

+1 更快的答案。可以使用“xml”序列化方法输出遵循HTML兼容性指南的XHTML文档。 - user357812
2
Meta是一个问题,因为在HTML输出中没有结束标记。我想XHTML会正确关闭标记。 - jlp

1

这也取决于您从输出标记中插入的文档类型。例如,使用XHTML会省略META标记。

   <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
如果您想要HTML输出而不添加MATE标签,只需在HTML标记中添加XML命名空间,就像这样:
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接