【问题标题】:Exception loading external XSLT加载外部 XSLT 时出现异常
【发布时间】:2011-06-27 05:07:35
【问题描述】:

我有来自第三方的 XSLT 负载,我需要用它来转换一些数据。

如果我使用 xsltproc,它可以正常工作并按预期输出数据。

我有以下 C# 代码可以尝试在进程中使用它:

sXML 是 XML 的块 oJob.ContentTemplate 是 XSLT 文件的本地文件路径

try
{
    using (StringWriter oOutputString = new StringWriter())
    {
        using (XmlTextWriter oOutputWriter = new XmlTextWriter(oOutputString))
        {
            using (StringReader oInputString = new StringReader(sXML))
            {
                using (XmlTextReader oInputReader = new XmlTextReader(oInputString))
                {
                    XslCompiledTransform oXSLTTransform = new XslCompiledTransform();
                    oXSLTTransform.Load(oJob.ContentTemplate, XsltSettings.TrustedXslt, new XmlUrlResolver());
                    oXSLTTransform.Transform(oInputReader, oOutputWriter);
                    String sHTML = oOutputWriter.ToString();
                }
            }
        }
    }
}
catch (Exception e)
{}

抛出的异常是:

附加信息:找不到实现前缀“http://dlxs.org”的脚本或外部对象。

XSLT 相当复杂,目前我大部分都不懂。有没有一种方法可以让我在不深入研究 XSLT 的情况下完成这项工作?

Visual Studio 2010 应该支持 EXSLT 吧?

编辑:如果我启用调试并进入它,我可以看到错误:

<xsl:import href="../../lib/xslfunctions.xsl"/>
......
<xsl:when test="contains($BibRegions, dlxs:normAttr($searchRgn))">

这些函数应该已经包含了,本地 XSLT 文件之一包含以下内容:

 <?xml version="1.0" encoding="UTF-8" ?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/strings" xmlns:exsl="http://exslt.org/common" xmlns:func="http://exslt.org/functions" xmlns:dlxs="http://dlxs.org" extension-element-prefixes="str exsl dlxs func" exclude-result-prefixes="str exsl dlxs func">
<!-- extension functions -->
<func:function name="dlxs:normAttr">
    <xsl:param name="attr"/>
    <!-- strip out spaces,commas,question marks -->
    <xsl:variable name="temp" select="translate($attr,' ,?','')"/>
    <func:result select="translate($temp,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')"/>
</func:function>
.....
</xsl:stylesheet>

是 Visual Studio 无法打开这些文件是因为它们使用 UNIX 路径还是因为安全问题无法打开本地文件?

编辑 2:

我正在使用的扩展是:

 <xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:str="http://exslt.org/strings"
  xmlns:exsl="http://exslt.org/common"
  xmlns:func="http://exslt.org/functions"
  xmlns:dlxs="http://dlxs.org"
  extension-element-prefixes="str exsl dlxs func"
  exclude-result-prefixes="str exsl dlxs func">

我是 XSLT 初学者,所以不确定您需要什么。

【问题讨论】:

  • 您似乎正在使用一些 XSLT 扩展。您需要正确指定在哪里可以找到它们。如何完成取决于您使用的扩展。能否请您发布更多详细信息?

标签: c# visual-studio-2010 xslt exslt


【解决方案1】:

您需要查看命名空间http://dlxs.org 的XSLT 文档。我会去这里的网站:

http://www.dlxs.org/products/index.html

看起来您的 XSLT 正在使用一些需要的扩展。

【讨论】:

    【解决方案2】:

    仅 EXSLT 通用模块 is supported by the .NET XSLT engine。要使用所有 EXSLT,您必须使用此处列出的兼容引擎之一(或重写您的样式表):

    EXSLT - func:function

    编辑:您可能会幸运地使用由一些 Microsoft MVP 开发的 Mvp.Xml 库,该库可在 Codeplex 获得。它提供了一些 EXSLT 支持:

    Mvp.Xml Project

    【讨论】:

    • 真可惜,这些似乎都不适用于 .NET。
    • 谢谢,但我认为 mvp.xml 没有帮助。我已经用这些库尝试了我的代码,但我仍然有同样的错误。
    • @Gordon Carpenter-Thompson:如果您必须使用 .NET,您可能想看看 SAXON 的(商业)版本,它也支持 .NET 上的 EXSLT。不过我自己没试过。
    • @Gordon Carpenter-Thompson:错误信息解释:因为func:function是not null命名空间中的顶级元素并且.Net没有实现EXSLT的http://exslt.org/functions模块,所以这个元素是将被处理器忽略。然后,dlxs:normAttr() 扩展函数调用出现错误,因为找不到实现。样式表函数定义不是标准的 XSLT 1.0 机制。您应该考虑升级到 XSLT 2.0 以获得此功能。
    • “.NET XSLT 引擎不支持 EXSLT。” - 这是错误的,或者如果我是慈善的,那么不精确。 XslCompiledTransform 至少支持部分 EXSL - 我知道这一点,因为我正在使用它。但是,它似乎不支持字符串模块。
    【解决方案3】:

    感谢大家的帮助。

    我无法使用任何本机 .NET 库来完成这项工作,所以我解决了这个问题。使用它的程序只打算运行一次以填充数据库,因此性能并不是非常重要。对于那些对此感兴趣的人,我的解决方案是。我使用 XSLTProc.exe 转换数据,以临时文件的形式流式传输到磁盘,然后再次将输出读回。讨厌但有效。

    using (TemporaryFile oTempInputFile = new TemporaryFile())
    {
        //write the content out to the temporary file
        using (StreamWriter oWriter = new StreamWriter(oTempInputFile.FilePath, false, System.Text.Encoding.UTF8))
        {
            oWriter.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
            oWriter.WriteLine(oTextNode.OuterXml);
            oWriter.Close();
        }
    
    
        using (TemporaryFile oTempOutputFile = new TemporaryFile())
        {
            try
            {
                String sXSLTProcArguments = "-o \"" + oTempOutputFile.FilePath + "\" \"" + oJob.ContentTemplate + "\" \"" + oTempInputFile.FilePath + "\"";
    
                Process oProcess = new Process();
                oProcess.StartInfo.UseShellExecute = false;
                oProcess.StartInfo.FileName = oJob.XSLTParser;
                oProcess.StartInfo.Arguments = sXSLTProcArguments;
                oProcess.StartInfo.RedirectStandardOutput = true;
                oProcess.StartInfo.RedirectStandardError = true;
                oProcess.StartInfo.CreateNoWindow = true;
                oProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                oProcess.Start();
                oProcess.WaitForExit(5000);
    
                if (File.Exists(oTempOutputFile.FilePath))
                {
                    using (StreamReader oReader = new StreamReader(oTempOutputFile.FilePath))
                    {
                        String sHTML = oReader.ReadToEnd();
    
                        if (sHTML.Length == 0)
                        {
                            Logger.Write(new DebugLogEntry("No HTML content was generated"));
                        }
                        else
                        {
                            //Do something with sHTML
                        }
                    }
                }
                else
                {
                    Logger.Write(new GeneralLogEntry("Failed to transform content for " + sDocumentID));
                }
            }
            catch (Exception e)
            {
                Logger.Write(new GeneralLogEntry("Exception thrown when transforming content for " + sDocumentID));
                Logger.Write(new DebugLogEntry(e.Message));
                Logger.Write(new DebugLogEntry(e.StackTrace));
            }
        }
    }    
    

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      相关资源
      最近更新 更多