2010-12-10 71 views
4

我用这个代码来转换XML使用XSLT模板HTML:为什么XslCompiledTransform将META标签添加到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

输出方法=“html”(http://www.w3.org/TR/xslt#section-HTML-Output-Method)的XSLT 1.0规范规定,如果存在头部,则输出元素元素在结果树段:

如果有磁头元件,则 HTML输出方法应HEAD元素 的 开始标记指定实际使用的字符编码 后立即添加META 元件。

因此,XslCompiledTransform做了XSLT处理器应该做的事情。如果你不想要meta元素,你需要更详细地解释你想要什么类型的输出,或者为什么元是一个问题,如果你想要html输出。你当然可以使用output method =“xml”,这样你就不会得到meta元素,但我不确定这样的序列化结果将成为你想要的'br'元素节点的东西。

+0

+1更快的答案。 [HTML兼容性指南](http://www.w3.org/TR/xhtml1/#guidelines) – 2010-12-10 13:11:03

+2

使用“xml”序列化方法输出XHTML文档是可行的。Meta是一个问题,因为在html输出中没有结束标签。我猜想XHTML将标签正确关闭。 – jlp 2010-12-13 15:11:41

5

简短的回答

使用

<xsl:output method="xml"/> 

这消除了任何添加HTML标签苏施为<meta>

与此同时,您可能难以实现某些元素的精确想要的词汇表​​示。

在XSLT 2.0可以使用

<xsl:output method="xhtml"/> 
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输出正好HTML标签 添加XML命名空间这样

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
相关问题