public string Provide(XmlConfigRuleContext ruleContext)
        {
            XslTransformRule.Context context = new XslTransformRule.Context();
            context.FileManager = ruleContext.FileManager;
            context.ReadFromXmlNode( ruleContext.RuleConfig );

            string result = Rule.Provide(context);
            // test for result
            XPathNavigator nav = ruleContext.RuleConfig.CreateNavigator();
            XPathNavigator resultNav = nav.SelectSingleNode("result");
            if (resultNav!=null) {
                // store result in file
                string resultFileName = resultNav.GetAttribute("file",String.Empty);
                if (!String.IsNullOrEmpty( resultFileName )) {
                    if (log.IsEnabledFor(LogEvent.Debug))
                        log.Write(LogEvent.Debug,
                            new{Action="writing transform result to file",Filename=resultFileName});
                    ruleContext.FileManager.Write(resultFileName, result);
                    result = null;
                }
            }
            return result;
        }
        public void Execute(FileRuleContext ruleContext)
        {
            XslTransformRule.Context xsltContext = new XslTransformRule.Context();
            xsltContext.FileManager = ruleContext.FileManager;
            xsltContext.ReadFromXmlNode(ruleContext.XmlSettings);
            string resContent = TransformRule.Provide(xsltContext);

            XPathNavigator resultFileNameNav = ruleContext.XmlSettings.SelectSingleNode("result/@file");
            if (resultFileNameNav != null) {
                if (!String.IsNullOrEmpty(resultFileNameNav.Value)) {
                    if (log.IsEnabledFor(LogEvent.Debug))
                        log.Write(LogEvent.Debug,
                            new {
                                Msg = "Writing XSL transformation result to file",
                                File = resultFileNameNav.Value
                            });
                    ruleContext.FileManager.Write(resultFileNameNav.Value, PrepareTransformedContent( resContent ) );
                } else
                    log.Write(LogEvent.Warn, "Nothing to do with XSLT result: output file name is not specified.");
            } else {
                // may be result-dependent files are configured?
                XPathNavigator resultFileNav = ruleContext.XmlSettings.SelectSingleNode("result/file");
                if (resultFileNav != null) {
                    // read result
                    var resultXPathDoc = new XPathDocument(new StringReader(resContent));

                    // check @xpath attr
                    var xPathNav = resultFileNav.SelectSingleNode("@xpath");
                    if (xPathNav==null) {
                        log.Write(LogEvent.Warn, "Nothing to do with XSLT result: XPath for output file is not specified.");
                        return;
                    }
                    string xPath = xPathNav.Value;
                    // determine file name xpath
                    string fileNameXPath = null;
                    var fileNameXPathNav = resultFileNav.SelectSingleNode("name/@xpath");
                    if (fileNameXPathNav != null)
                        fileNameXPath = fileNameXPathNav.Value;
                    // determine file content xpath
                    string fileContentXPath = null;
                    var fileContentXPathNav = resultFileNav.SelectSingleNode("content/@xpath");
                    if (fileContentXPathNav != null)
                        fileContentXPath = fileContentXPathNav.Value;

                    // iterate
                    var results = resultXPathDoc.CreateNavigator().Select(xPath);
                    if (log.IsEnabledFor(LogEvent.Info))
                        log.Write(LogEvent.Info, "Matched {0} file generation results.", results.Count);
                    foreach (XPathNavigator nav in results) {
                        // determine file name
                        var currentFileNameNav = nav.SelectSingleNode(fileNameXPath);
                        if (currentFileNameNav == null) {
                            log.Write(LogEvent.Warn, new {
                                Msg = "Result is matched but output file name is not matched." });
                            continue;
                        }
                        // determine file contents
                        var resultFileContentNav = nav.SelectSingleNode(fileContentXPath);
                        if (resultFileContentNav==null) {
                            log.Write(LogEvent.Warn, new {
                                Msg = "Result is matched but output file content is not matched." });
                            continue;
                        }

                        string fileContent = PrepareTransformedContent(resultFileContentNav.InnerXml);
                        ruleContext.FileManager.Write(currentFileNameNav.Value, fileContent);
                    }
                }

            }
        }