//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // // Microsoft //------------------------------------------------------------------------------ namespace System.Xml.Xsl.XsltOld { using Res = System.Xml.Utils.Res; using System; using System.Diagnostics; using System.Xml; using System.Xml.XPath; internal class TemplateLookupAction : Action { protected XmlQualifiedName mode; protected Stylesheet importsOf; internal void Initialize(XmlQualifiedName mode, Stylesheet importsOf) { this.mode = mode; this.importsOf = importsOf; } internal override void Execute(Processor processor, ActionFrame frame) { Debug.Assert(processor != null && frame != null); Debug.Assert(frame.State == Initialized); Action action = null; if (this.mode != null) { action = importsOf == null ? processor.Stylesheet.FindTemplate(processor, frame.Node, this.mode) : importsOf.FindTemplateImports(processor, frame.Node, this.mode); } else { action = importsOf == null ? processor.Stylesheet.FindTemplate(processor, frame.Node) : importsOf.FindTemplateImports(processor, frame.Node); } // Built-int template rules if (action == null) { action = BuiltInTemplate(frame.Node); } // Jump if (action != null) { frame.SetAction(action); } else { frame.Finished(); } } internal Action BuiltInTemplate(XPathNavigator node) { Debug.Assert(node != null); Action action = null; switch (node.NodeType) { // // // case XPathNodeType.Element: case XPathNodeType.Root: action = ApplyTemplatesAction.BuiltInRule(this.mode); break; // // // case XPathNodeType.Attribute: case XPathNodeType.Whitespace: case XPathNodeType.SignificantWhitespace: case XPathNodeType.Text: action = ValueOfAction.BuiltInRule(); break; // case XPathNodeType.ProcessingInstruction: case XPathNodeType.Comment: // Empty action; break; case XPathNodeType.All: // Ignore the rest break; } return action; } } internal class TemplateLookupActionDbg : TemplateLookupAction { internal override void Execute(Processor processor, ActionFrame frame) { Debug.Assert(processor != null && frame != null); Debug.Assert(frame.State == Initialized); Debug.Assert(processor.Debugger != null); Action action = null; if (this.mode == Compiler.BuiltInMode) { // mode="*" -- use one from debuggerStack this.mode = processor.GetPrevioseMode(); Debug.Assert(this.mode != Compiler.BuiltInMode); } processor.SetCurrentMode(this.mode); if (this.mode != null) { action = importsOf == null ? processor.Stylesheet.FindTemplate(processor, frame.Node, this.mode) : importsOf.FindTemplateImports(processor, frame.Node, this.mode); } else { action = importsOf == null ? processor.Stylesheet.FindTemplate(processor, frame.Node) : importsOf.FindTemplateImports(processor, frame.Node); } // Built-int template rules if (action == null && processor.RootAction.builtInSheet != null) { action = processor.RootAction.builtInSheet.FindTemplate(processor, frame.Node, Compiler.BuiltInMode); } if (action == null) { action = BuiltInTemplate(frame.Node); } // Jump if (action != null) { frame.SetAction(action); } else { frame.Finished(); } } } }