我创建了一个MVC Web应用程序,它将转换后的XML文件显示为视图(该应用程序正在使用Web门户来查看类似DITA的文档)。我创建了一个名为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>
XmlView
提供了一个XSL转换,它将XML文件转换为HTML,然后输出生成的HTML。但是,当我包含HTML&lt; script&gt;时在转换中,XSLT处理器输出格式错误的XML,其中父标记的一些结束标记嵌套在&lt; script&gt;中。例如:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test Case 1067</title>
<link rel="stylesheet" href="Site.css" />
</head>
<body>
<div class="test-case">
<!-- Removed for brevity. -->
</div>
<script></body></html></script>
</body>
</html>
我试图换掉&lt; script&gt;对于其他标签(自闭合和其他标签),这些标签不会导致问题,只有&lt; script&gt;。我还尝试使用&lt; xsl:element&gt;构建标记。无济于事。我试图将标签封装在CDATA部分中,但这并没有令人满意的结果。
我怀疑&lt; msxsl:script&gt;标签可能会干扰但是这个假设仍然会让许多事情无法解释,特别是因为我在XSLT处理器上禁用了脚本。
有什么想法吗?
答案 0 :(得分:0)
从样式表中删除默认名称空间声明,从而从&lt; html&gt;中删除输出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>