使用Microsoft XSL </script>时格式错误的<script>标记

时间:2013-12-31 21:29:54

标签: 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.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处理器上禁用了脚本。

有什么想法吗?

1 个答案:

答案 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>