C# 格式错误<;脚本>;使用Microsoft XSL时的标记
我创建了一个MVC web应用程序,它将转换后的XML文件显示为视图(该应用程序被用作web门户来查看类似DITA的文档)。我创建了一个名为C# 格式错误<;脚本>;使用Microsoft XSL时的标记,c#,html,asp.net-mvc,xslt,msxsl,C#,Html,Asp.net Mvc,Xslt,Msxsl,我创建了一个MVC web应用程序,它将转换后的XML文件显示为视图(该应用程序被用作web门户来查看类似DITA的文档)。我创建了一个名为XmlView的定制IView类,它将XML文件和XSL样式表作为参数 public class XmlView : IView { string xmlFile; string xsltFile; public XmlView(string xsltFile, string xmlFile) { this.xml
XmlView
的定制IView类,它将XML文件和XSL样式表作为参数
public class XmlView : IView {
string xmlFile;
string xsltFile;
public XmlView(string xsltFile, string xmlFile) {
this.xmlFile = xmlFile;
this.xsltFile = xsltFile;
}
#region IView Members
public void Render(ViewContext viewContext, TextWriter writer) {
var xslSettings = new XsltSettings {
EnableScript = false
};
var xsl = new XslCompiledTransform();
var settings = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Parse
};
var xslParams = new XsltArgumentList();
xslParams.AddParam("applicationBasePath", "", UrlHelper.GenerateContentUrl("~", viewContext.HttpContext));
XmlReader reader = null;
try {
reader = XmlTextReader.Create(xmlFile, settings);
var htmlWriter = new HtmlTextWriter(writer, "\t");
xsl.Load(xsltFile, xslSettings, null);
xsl.Transform(reader, xslParams, htmlWriter);
} finally {
reader.Close();
reader.Dispose();
}
}
#endregion
}
转换文件如下所示:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xhtml"
>
<xsl:output method="html" indent="yes"/>
<xsl:namespace-alias result-prefix="#default" stylesheet-prefix="xhtml"/>
<xsl:param name="applicationBasePath"></xsl:param>
<xsl:template match="/">
<html>
<head>
<title>Test Case <xsl:value-of select="/*/requirements/requirement/@id"/>
</title>
<link rel="stylesheet" href="{$applicationBasePath}Content/test-case.css" />
</head>
<body>
<div class="test-case">
<!-- Removed for brevity. -->
</div>
<script src="Scripts/jquery-2.0.3.js"></script>
</body>
</html>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我尝试用其他标签(包括自动关闭标签和其他标签)替换这些标签,这些标签只会导致问题。我还尝试使用构建标记,但没有成功。我试图将标记包含在CDATA区域中,但没有理想的结果
我的怀疑是,标记可能会产生干扰,但这一假设仍然有许多原因无法解释,特别是因为我禁用了XSLT处理器上的脚本
有什么想法吗?将默认名称空间声明从样式表中删除,从而从输出XHTML中的标记中删除,成功了
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xhtml"
>
</xsl:stylesheet>
XSLT创建XHTML输出。如果您的目标是输出XHTML,那么.NET代码不应该使用XHTML-xtwriter
istead ofhtmlextwriter
?或者确保XSLT通过删除xmlns=”来创建HTMLhttp://www.w3.org/1999/xhtml“
。像xslcomiledtransform
这样的XSLT1.0处理器并不真正适合创建作为文本/html并由html解析器解析的XHTML。我不知道还有XhtmlTextWriter
。虽然样式表中的xmlns
属性更有可能是罪魁祸首,但我也改变了这一点。为了澄清这一点,如果您将样式表更改为输出不带名称空间的HTML,那么您应该继续使用HtmlTextWriter
。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xhtml"
>
</xsl:stylesheet>