The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.XsltOld \ TemplateLookupActionDbg

  1. //------------------------------------------------------------------------------
  2. // <copyright file="TemplateLookupAction.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Xml.Xsl.XsltOld
  16. {
  17.     using Res = System.Xml.Utils.Res;
  18.     using System;
  19.     using System.Diagnostics;
  20.     using System.Xml;
  21.     using System.Xml.XPath;
  22.    
  23.     internal class TemplateLookupAction : Action
  24.     {
  25.         protected XmlQualifiedName mode;
  26.         protected Stylesheet importsOf;
  27.        
  28.         internal void Initialize(XmlQualifiedName mode, Stylesheet importsOf)
  29.         {
  30.             this.mode = mode;
  31.             this.importsOf = importsOf;
  32.         }
  33.        
  34.         internal override void Execute(Processor processor, ActionFrame frame)
  35.         {
  36.             Debug.Assert(processor != null && frame != null);
  37.             Debug.Assert(frame.State == Initialized);
  38.            
  39.             Action action = null;
  40.            
  41.             if (this.mode != null) {
  42.                 action = importsOf == null ? processor.Stylesheet.FindTemplate(processor, frame.Node, this.mode) : importsOf.FindTemplateImports(processor, frame.Node, this.mode);
  43.             }
  44.             else {
  45.                 action = importsOf == null ? processor.Stylesheet.FindTemplate(processor, frame.Node) : importsOf.FindTemplateImports(processor, frame.Node);
  46.             }
  47.            
  48.             // Built-int template rules
  49.             if (action == null) {
  50.                 action = BuiltInTemplate(frame.Node);
  51.             }
  52.            
  53.             // Jump
  54.             if (action != null) {
  55.                 frame.SetAction(action);
  56.             }
  57.             else {
  58.                 frame.Finished();
  59.             }
  60.         }
  61.        
  62.         internal Action BuiltInTemplate(XPathNavigator node)
  63.         {
  64.             Debug.Assert(node != null);
  65.             Action action = null;
  66.            
  67.             switch (node.NodeType) {
  68.                 case XPathNodeType.Element:
  69.                 case XPathNodeType.Root:
  70.                     // <xsl:template match="*|/" [mode="?"]>
  71.                     // <xsl:apply-templates [mode="?"]/>
  72.                     // </xsl:template>
  73.                     action = ApplyTemplatesAction.BuiltInRule(this.mode);
  74.                     break;
  75.                 case XPathNodeType.Attribute:
  76.                 case XPathNodeType.Whitespace:
  77.                 case XPathNodeType.SignificantWhitespace:
  78.                 case XPathNodeType.Text:
  79.                     // <xsl:template match="text()|@*">
  80.                     // <xsl:value-of select="."/>
  81.                     // </xsl:template>
  82.                     action = ValueOfAction.BuiltInRule();
  83.                     break;
  84.                 case XPathNodeType.ProcessingInstruction:
  85.                 case XPathNodeType.Comment:
  86.                     // <xsl:template match="processing-instruction()|comment()"/>
  87.                     // Empty action;
  88.                     break;
  89.                 case XPathNodeType.All:
  90.                     // Ignore the rest
  91.                     break;
  92.             }
  93.            
  94.             return action;
  95.         }
  96.     }
  97.    
  98.     internal class TemplateLookupActionDbg : TemplateLookupAction
  99.     {
  100.         internal override void Execute(Processor processor, ActionFrame frame)
  101.         {
  102.             Debug.Assert(processor != null && frame != null);
  103.             Debug.Assert(frame.State == Initialized);
  104.             Debug.Assert(processor.Debugger != null);
  105.            
  106.             Action action = null;
  107.            
  108.             if (this.mode == Compiler.BuiltInMode) {
  109.                 // mode="*" -- use one from debuggerStack
  110.                 this.mode = processor.GetPrevioseMode();
  111.                 Debug.Assert(this.mode != Compiler.BuiltInMode);
  112.             }
  113.             processor.SetCurrentMode(this.mode);
  114.            
  115.             if (this.mode != null) {
  116.                 action = importsOf == null ? processor.Stylesheet.FindTemplate(processor, frame.Node, this.mode) : importsOf.FindTemplateImports(processor, frame.Node, this.mode);
  117.             }
  118.             else {
  119.                 action = importsOf == null ? processor.Stylesheet.FindTemplate(processor, frame.Node) : importsOf.FindTemplateImports(processor, frame.Node);
  120.             }
  121.            
  122.             // Built-int template rules
  123.             if (action == null && processor.RootAction.builtInSheet != null) {
  124.                 action = processor.RootAction.builtInSheet.FindTemplate(processor, frame.Node, Compiler.BuiltInMode);
  125.             }
  126.             if (action == null) {
  127.                 action = BuiltInTemplate(frame.Node);
  128.             }
  129.            
  130.             // Jump
  131.             if (action != null) {
  132.                 frame.SetAction(action);
  133.             }
  134.             else {
  135.                 frame.Finished();
  136.             }
  137.         }
  138.     }
  139. }

Developer Fusion