"禁止执行'document()'功能." 其中EnableDocumentFunction设置为true?

Cam*_*amM 3 .net c# xml xslt c#-4.0

在尝试xslt转换时,我在生产环境中得到间歇性的System.Xml.Xsl.XslTransformException异常,遗憾的是我无法在开发环境中复制它.

该例外情况进一步详述:

禁止执行'document()'功能.使用XsltSettings.EnableDocumentFunction属性启用它.C:\ path\to\file\CDS.xsl(16,3)发生错误.

然而,EnableDocumentFunction属性设置为true的处理代码:

private void Transform()
{
    var keepTrying = true;
    var tryCount = 0;
    const int maxRetrys = 3;

    while (keepTrying)
    {
        try
        {
            var xmlResolver = new XmlUrlResolver();

            using (var xmlFile = new XmlNodeReader(_xDoc))
            {
                var settings = new XmlReaderSettings
                                   {
                                       XmlResolver = xmlResolver,
                                       ProhibitDtd = false,
                                       DtdProcessing = DtdProcessing.Ignore
                                   };

                using (var xsl = XmlReader.Create(_xslPath, settings))
                {
                    var xslt = new XslCompiledTransform(true);
                    xslt.Load(xsl, new XsltSettings { EnableDocumentFunction = true }, xmlResolver);

                    var sb = new StringBuilder();
                    using (var writer = XmlWriter.Create(sb, xslt.OutputSettings))
                    {
                        xslt.Transform(xmlFile, null, writer, xmlResolver); // errors out here.
                    }

                    var xhtml = sb.ToString();
                    _transformedXml = xhtml;
                    _isTransformed = true;

                    xsl.Close();
                }
            }

            keepTrying = false;
        }
        catch (System.Xml.Xsl.XsltException ex)
        {
            ExceptionPolicy.HandleException(ex, "ExceptionLogging");

            tryCount++;
            if (tryCount > maxRetrys)
            {
                keepTrying = false;
                throw;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

xslt文件由第三方提供并自动更新,因此不能重写它.这是它的顶部,由于隐私原因略有修改:

<?xml version="1.0"?>

<!--
     Interaction_550.xsl : 20110916
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:example="http://www.example.com" version="1.0">
  <xsl:param name="D2DSeverityFilter"></xsl:param>
  <xsl:param name="D2HSeverityFilter"></xsl:param>
  <xsl:param name="DocumentationFilter"></xsl:param>
  <xsl:output method="html"/>
  <xsl:key name="d2d_sev_level-lookup" match="example:d2d_sev_level" use="@name"/>
  <xsl:key name="d2h_sev_level-lookup" match="example:d2h_sev_level" use="@name"/>
      <xsl:key name="d2l_sev_level-lookup" match="example:d2l_sev_level" use="@name"/>
      <xsl:key name="preg_cat-lookup" match="example:preg_cat" use="@cat"/>
  <xsl:key name="doc_level-lookup" match="example:doc_level" use="@name"/>
  <xsl:variable name="d2d_sev_level-top" select="document('')/*/example:d2d_sev_levels"/>
  <xsl:variable name="d2h_sev_level-top" select="document('')/*/example:d2h_sev_levels"/>
      <xsl:variable name="d2l_sev_level-top" select="document('')/*/example:d2l_sev_levels"/>

  <xsl:variable name="doc_level-top" select="document('')/*/example:doc_levels"/>
      <xsl:variable name="preg_cat-top" select="document('')/*/example:preg_cats"/>
  <xsl:template match="/">
    <head>
      <style type="text/css">
body {
font-family : arial,sans serif,helvetica;
}
...
Run Code Online (Sandbox Code Playgroud)

我怎么能够:

  • 解决这个问题,以便它根本不会发生?
  • 如果不这样做,我怎么能在开发中复制这个?

Ton*_*hih 6

或者使用MS XslCompiledTransform类,您可以使用XsltSettings类来避免错误本身描述的此错误.来自MSDN