2017-06-13 32 views
1

我正在使用最新版本的Saxon HE for .NET(9.7.0.18),并且看到我的样式表文件被锁定的问题。这个问题并不总是立即发生,但我通常会在几次调用样式表后看到问题。到那时,我将不再能够通过文本编辑器保存有关样式表的更改,直到我回收应用程序池为止。如何在使用撒克逊时停止样式表文件锁定?

从我目前看到的情况来看,似乎支持通过xsl:import或xsl:include拉入的样式表被锁定,但顶级样式表未锁定。

我能够通过创建一个新的MVC项目并调用以下GetXslt2FO方法来重现此问题。在使用.NET XslCompiledTransform时,我看不到这个问题。

如何停止发生文件锁?

这里是我的示例代码:

public XsltExecutable GetExecutable(string stylesheetPath) 
    { 
     using (FileStream s = new FileStream(stylesheetPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     { 
      var processor = new Processor(); 
      var compiler = processor.NewXsltCompiler(); 
      compiler.BaseUri = new Uri(stylesheetPath); 
      var executable = compiler.Compile(s); 
      return executable; 
     } 
    } 

    public string GetXslt2FO(string xsltFilePath, XDocument xml, Dictionary<string, string> args) 
    { 
     // Compile stylesheet 
     var executable = GetExecutable(xsltFilePath); 
     var declaredArgs = executable.GetGlobalParameters(); 

     // Do transformation to a destination 
     var destination = new DomDestination(); 
     using (var inputStream = new MemoryStream()) 
     { 
      xml.Save(inputStream); 
      inputStream.Position = 0; 
      var transformer = executable.Load(); 
      FileInfo stylesheetFileInfo = new FileInfo(xsltFilePath); 
      transformer.SetInputStream(inputStream, new Uri(stylesheetFileInfo.DirectoryName)); 
      foreach (var arg in args) 
      { 
       var matchingArgDeclaration = declaredArgs.FirstOrDefault(a => a.Key.LocalName.ToLower() == arg.Key.ToLower()); 
       if (matchingArgDeclaration.Key == null) 
       { 
        transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(arg.Value)); 
       } 
       else 
       { 
        // try to load up the specific parameter type 
        // list is based on http://www.saxonica.com/documentation/#!dotnetdoc/Saxon.Api/XdmAtomicValue 
        XdmItemType argType = matchingArgDeclaration.Value.getDeclaredItemType(); 
        var argTypeName = ""; 
        if (argType != null && 
         argType is XdmAtomicType) 
         argTypeName = ((XdmAtomicType)argType).Name.LocalName; 
        switch (argTypeName.ToLower()) 
        { 
         case "boolean": 
          transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToBoolean(arg.Value))); 
          break; 

         case "integer": 
          transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToInt32(arg.Value))); 
          break; 

         case "decimal": 
          transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToDecimal(arg.Value))); 
          break; 

         case "float": 
          transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToSingle(arg.Value))); 
          break; 

         case "double": 
          transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToDouble(arg.Value))); 
          break; 

         case "anyuri": 
          transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(new Uri(arg.Value))); 
          break; 

         case "qname": 
          transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(new QName(arg.Value))); 
          break; 

         default: 
          transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(((arg.Value)))); 
          break; 
        } 
       } 
      } 

      transformer.Run(destination); 
     } 

     return destination.XmlDocument.OuterXml; 
    } 
+0

我在这里提出了一个撒克逊问题:请跟踪它:https://saxonica.plan.io/issues/3275 –

+0

你能更准确地了解症状 - 什么告诉你一个文件被锁定? –

+0

我已更新我的问题详细信息。一旦文件被锁定,我不再能够通过文本编辑器保存更改。 – Scott

回答

1

这是一个撒克逊错误,并固定在维护版本9.8.0.2。感谢您报告。