2017-06-13 3 views
1

Ich verwende die neueste Version von Saxon HE für. NET (9.7.0.18) und sehe Probleme mit meinen Stylesheet-Dateien gesperrt werden. Das Problem tritt nicht immer sofort auf, aber ich werde das Problem im Allgemeinen nach mehreren Aufrufen des Stylesheets sehen. Zu diesem Zeitpunkt kann ich Änderungen am betreffenden Stylesheet nicht mehr über einen Texteditor speichern, bis ich den Anwendungspool recycelt habe.Wie kann ich das Sperren von Stylesheet-Dateien bei Verwendung von Saxon stoppen?

Aus dem, was ich bisher gesehen habe, scheint es, dass das Unterstützen von Stylesheets, die über xsl: import oder xsl: include eingebunden wurden, gesperrt wird, aber Top-Level-Stylesheets nicht gesperrt werden.

Ich kann das Problem reproduzieren, indem Sie ein neues MVC-Projekt erstellen und die folgende GetXslt2FO-Methode aufrufen. Ich sehe dieses Problem nicht, wenn ich mit .NET XslCompiledTransform arbeite.

Wie kann ich verhindern, dass Dateisperren auftreten?

Hier ist mein Beispielcode:

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

Ich habe eine Saxon Problem hier angesprochen: Bitte verfolgen Sie es: https://saxonica.plan.io/issues/3275 –

+0

Könnten Sie genauer über die Symptome sein - was sagt Ihnen, dass eine Datei gesperrt ist? –

+0

Ich habe meine Fragedetails aktualisiert. Sobald die Datei gesperrt ist, kann ich sie nicht mehr über einen Texteditor speichern. – Scott

Antwort

1

Dies war ein Sachse Fehler und ist in Maintenance-Release 9.8.0.2 behoben. Danke, dass du es gemeldet hast.

Verwandte Themen