C# 格式错误<;脚本>;使用Microsoft XSL时的标记

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

我创建了一个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>       
我尝试用其他标签(包括自动关闭标签和其他标签)替换这些标签,这些标签只会导致问题。我还尝试使用构建标记,但没有成功。我试图将标记包含在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 of
htmlextwriter
?或者确保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>