Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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;
        }