private static void CopyXslElements(SageContext context, string stylesheetPath, CacheableXmlDocument targetDocument) { CacheableXmlDocument fromDocument = context.Resources.LoadXml(stylesheetPath); targetDocument.AddDependencies(fromDocument.Dependencies); string xpathOthers = string.Join(" | ", new[] { "/*/xsl:preserve-space", "/*/xsl:strip-space", "/*/xsl:namespace-alias", "/*/xsl:attribute-set" }); XmlNodeList paramNodes = fromDocument.SelectNodes("/*/xsl:param", XmlNamespaces.Manager); XmlNodeList variableNodes = fromDocument.SelectNodes("/*/xsl:variable", XmlNamespaces.Manager); XmlNodeList templateNodes = fromDocument.SelectNodes("/*/xsl:template", XmlNamespaces.Manager); XmlNodeList includeNodes = fromDocument.SelectNodes("/*/xsl:include", XmlNamespaces.Manager); XmlNodeList scriptNodes = fromDocument.SelectNodes("/*/msxsl:script", XmlNamespaces.Manager); XmlNodeList otherNodes = fromDocument.SelectNodes(xpathOthers, XmlNamespaces.Manager); string stylesheetDirectory = Path.GetDirectoryName(stylesheetPath); // recursively add any includes foreach (XmlElement includeElem in includeNodes) { string includeHref = includeElem.GetAttribute("href"); Uri includeHrefUri = new Uri(includeHref, UriKind.RelativeOrAbsolute); string includePath = includeHrefUri.IsAbsoluteUri ? includeHref : string.Join("/", stylesheetDirectory, includeHref); ModuleConfiguration.CopyXslElements(context, includePath, targetDocument); targetDocument.AddDependencies(includePath); } // templates foreach (XmlNode xslNode in templateNodes) targetDocument.DocumentElement.AppendChild(targetDocument.ImportNode(xslNode, true)); foreach (XmlNode xslNode in scriptNodes) targetDocument.DocumentElement.AppendChild(targetDocument.ImportNode(xslNode, true)); XmlNode firstNode = targetDocument.SelectSingleNode("/*/xsl:template[1]", XmlNamespaces.Manager); foreach (XmlNode xslNode in variableNodes) firstNode = targetDocument.DocumentElement.InsertBefore(targetDocument.ImportNode(xslNode, true), firstNode); // other nodes before variables or templates, params before other nodes foreach (XmlNode xslNode in otherNodes) firstNode = targetDocument.DocumentElement.InsertBefore(targetDocument.ImportNode(xslNode, true), firstNode); foreach (XmlNode xslNode in paramNodes) targetDocument.DocumentElement.InsertBefore(targetDocument.ImportNode(xslNode, true), targetDocument.DocumentElement.SelectSingleNode("*")); foreach (XmlAttribute attrNode in fromDocument.DocumentElement.Attributes) targetDocument.DocumentElement.SetAttribute(attrNode.Name, attrNode.InnerText); }
private XmlNode ResolveExtraDocumentInclude(XmlNamespaceManager nm, string parse, string includePath, string xpath, string encoding, SageContext context) { XmlNode result; if (parse == "text") { WebRequest request = WebRequest.Create(includePath); WebResponse response = request.GetResponse(); using (Stream stream = response.GetResponseStream()) { Encoding enc = Encoding.GetEncoding(encoding); string text = new StreamReader(stream, enc).ReadToEnd(); result = this.CreateTextNode(text); } } else { CacheableXmlDocument temp = new CacheableXmlDocument(); temp.LoadInternal(includePath, context, false); result = temp.DocumentElement; if (!string.IsNullOrWhiteSpace(xpath)) { result = temp.SelectSingleNode(xpath, nm); } } if (result != null && result.NodeType == XmlNodeType.Document) result = ((XmlDocument) result).DocumentElement; return result; }