public XslFile(XslFilename filename) : base(filename) { _lastModified = DateTime.MinValue; }
public override bool Execute() { string[] templates = ApplySecondaryValue(Transform, "Transform", Sources); string[] outputs = ApplySecondaryValue(Outputs, "Output", Sources); if (Sources.Length == 0) { return(true); } for (int i = 0; i < Sources.Length; i++) { XslFilename name = new XslFilename(templates[i], _debug); XslFile xsl; lock (_files) { if (!_files.TryGetValue(name, out xsl)) { xsl = new XslFile(name); _files[name] = xsl; } } try { xsl.EnsureCompiled(); } catch (System.Xml.Xsl.XsltException xc) { Log.LogError(null, null, null, xc.SourceUri, xc.LineNumber, xc.LinePosition, xc.LineNumber, xc.LinePosition, xc.Message); Log.LogError(null, null, null, xc.SourceUri, xc.LineNumber, xc.LinePosition, xc.LineNumber, xc.LinePosition, xc.ToString()); return(false); } string srcFile = Sources[i].ItemSpec; FileInfo fOut = new FileInfo(outputs[i]); XsltArgumentList al = new XsltArgumentList(); al.AddExtensionObject("http://schemas.qqn.nl/2008/02/ApplyXslTransform", new ApplyHelper(srcFile, this)); // Allows calling back into MSBuild al.AddParam("Src", "", srcFile); al.AddParam("SrcFilename", "", Path.GetFileName(srcFile)); al.AddParam("SrcFileTitle", "", Path.GetFileNameWithoutExtension(srcFile)); al.AddParam("SrcDir", "", Path.GetDirectoryName(Path.GetFullPath(srcFile))); al.AddParam("Dest", "", outputs[i]); al.AddParam("DestFilename", "", Path.GetFileName(outputs[i])); al.AddParam("DestFileTitle", "", Path.GetFileNameWithoutExtension(outputs[i])); al.AddParam("DestDir", "", Path.GetDirectoryName(Path.GetFullPath(outputs[i]))); al.AddParam("BaseDir", "", Environment.CurrentDirectory); al.AddParam("ProjectFile", "", BuildEngine.ProjectFileOfTaskNode); al.AddParam("TargetDir", "", TargetDir); al.AddParam("IntermediateDir", "", IntermediateDir); foreach (string iAttr in Attributes.Split(';')) { if (string.IsNullOrEmpty(iAttr.Trim())) { continue; } string[] q = iAttr.Split('='); al.AddParam(q[0].Trim(), "", q[1].Trim()); } Log.LogMessage(MessageImportance.High, "Transforming '{0}' into '{1}' using '{2}'", Sources[i].ItemSpec, outputs[i], Path.GetFileName(xsl.Filename)); try { using (Stream wtr = File.Create(outputs[i])) { xsl.Transform.Transform(srcFile, al, wtr); } } catch (XsltException xe) { Log.LogError(null, null, null, xe.SourceUri, xe.LineNumber, xe.LinePosition, xe.LineNumber, xe.LinePosition, xe.Message); Log.LogError(null, null, null, xe.SourceUri, xe.LineNumber, xe.LinePosition, xe.LineNumber, xe.LinePosition, xe.ToString()); try { File.Delete(outputs[i]); } catch { } } catch (Exception) { try { File.Delete(outputs[i]); } catch { } throw; } _filesWritten.Add(new TaskItem(outputs[i])); } return(true); }