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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="newinstructionaction.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 NewInstructionAction : ContainerAction
  24.     {
  25.         string name;
  26.         string parent;
  27.         bool fallback;
  28.        
  29.         internal override void Compile(Compiler compiler)
  30.         {
  31.             XPathNavigator nav = compiler.Input.Navigator.Clone();
  32.             name = nav.Name;
  33.             nav.MoveToParent();
  34.             parent = nav.Name;
  35.             if (compiler.Recurse()) {
  36.                 CompileSelectiveTemplate(compiler);
  37.                 compiler.ToParent();
  38.             }
  39.         }
  40.        
  41.         internal void CompileSelectiveTemplate(Compiler compiler)
  42.         {
  43.             NavigatorInput input = compiler.Input;
  44.             do {
  45.                 if (Keywords.Equals(input.NamespaceURI, input.Atoms.XsltNamespace) && Keywords.Equals(input.LocalName, input.Atoms.Fallback)) {
  46.                     fallback = true;
  47.                     if (compiler.Recurse()) {
  48.                         CompileTemplate(compiler);
  49.                         compiler.ToParent();
  50.                     }
  51.                 }
  52.             }
  53.             while (compiler.Advance());
  54.         }
  55.        
  56.         internal override void Execute(Processor processor, ActionFrame frame)
  57.         {
  58.             Debug.Assert(processor != null && frame != null);
  59.            
  60.             switch (frame.State) {
  61.                 case Initialized:
  62.                     if (!fallback) {
  63.                         throw XsltException.Create(Res.Xslt_UnknownExtensionElement, this.name);
  64.                     }
  65.                     if (this.containedActions != null && this.containedActions.Count > 0) {
  66.                         processor.PushActionFrame(frame);
  67.                         frame.State = ProcessingChildren;
  68.                         break;
  69.                     }
  70.                     else
  71.                         goto case ProcessingChildren;
  72.                     break;
  73.                 case ProcessingChildren:
  74.                     frame.Finished();
  75.                     break;
  76.                 default:
  77.                    
  78.                     Debug.Fail("Invalid Container action execution state");
  79.                     break;
  80.             }
  81.         }
  82.     }
  83. }

Developer Fusion