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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="CopyNodeSetAction.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 sealed class CopyNodeSetAction : Action
  24.     {
  25.         private const int BeginEvent = 2;
  26.         private const int Contents = 3;
  27.         private const int Namespaces = 4;
  28.         private const int Attributes = 5;
  29.         private const int Subtree = 6;
  30.         private const int EndEvent = 7;
  31.        
  32.         private static CopyNodeSetAction s_Action = new CopyNodeSetAction();
  33.        
  34.         static internal CopyNodeSetAction GetAction()
  35.         {
  36.             Debug.Assert(s_Action != null);
  37.             return s_Action;
  38.         }
  39.        
  40.         internal override void Execute(Processor processor, ActionFrame frame)
  41.         {
  42.             Debug.Assert(processor != null && frame != null);
  43.             while (processor.CanContinue) {
  44.                 switch (frame.State) {
  45.                     case Initialized:
  46.                         if (frame.NextNode(processor)) {
  47.                             frame.State = BeginEvent;
  48.                             goto case BeginEvent;
  49.                         }
  50.                         else {
  51.                             frame.Finished();
  52.                             break;
  53.                         }
  54.                         break;
  55.                     case BeginEvent:
  56.                         Debug.Assert(frame.State == BeginEvent);
  57.                        
  58.                         if (SendBeginEvent(processor, frame.Node) == false) {
  59.                             // This one wasn't output
  60.                             break;
  61.                         }
  62.                         frame.State = Contents;
  63.                         continue;
  64.                     case Contents:
  65.                        
  66.                         Debug.Assert(frame.State == Contents);
  67.                         XPathNodeType nodeType = frame.Node.NodeType;
  68.                        
  69.                         if (nodeType == XPathNodeType.Element || nodeType == XPathNodeType.Root) {
  70.                             processor.PushActionFrame(CopyNamespacesAction.GetAction(), frame.NodeSet);
  71.                             frame.State = Namespaces;
  72.                             break;
  73.                         }
  74.                        
  75.                         if (SendTextEvent(processor, frame.Node) == false) {
  76.                             // This one wasn't output
  77.                             break;
  78.                         }
  79.                         frame.State = EndEvent;
  80.                         continue;
  81.                     case Namespaces:
  82.                        
  83.                         processor.PushActionFrame(CopyAttributesAction.GetAction(), frame.NodeSet);
  84.                         frame.State = Attributes;
  85.                         break;
  86.                     case Attributes:
  87.                        
  88.                         if (frame.Node.HasChildren) {
  89.                             processor.PushActionFrame(GetAction(), frame.Node.SelectChildren(XPathNodeType.All));
  90.                             frame.State = Subtree;
  91.                             break;
  92.                         }
  93.                         frame.State = EndEvent;
  94.                         goto case EndEvent;
  95.                         break;
  96.                     case Subtree:
  97.                        
  98.                         //frame.Node.MoveToParent();
  99.                         frame.State = EndEvent;
  100.                         continue;
  101.                     case EndEvent:
  102.                        
  103.                         Debug.Assert(frame.State == EndEvent);
  104.                        
  105.                         if (SendEndEvent(processor, frame.Node) == false) {
  106.                             // This one wasn't output
  107.                             break;
  108.                         }
  109.                        
  110.                         frame.State = Initialized;
  111.                         continue;
  112.                 }
  113.                
  114.                 break;
  115.             }
  116.         }
  117.        
  118.         private static bool SendBeginEvent(Processor processor, XPathNavigator node)
  119.         {
  120.             return processor.CopyBeginEvent(node, node.IsEmptyElement);
  121.         }
  122.        
  123.         private static bool SendTextEvent(Processor processor, XPathNavigator node)
  124.         {
  125.             return processor.CopyTextEvent(node);
  126.         }
  127.        
  128.         private static bool SendEndEvent(Processor processor, XPathNavigator node)
  129.         {
  130.             return processor.CopyEndEvent(node);
  131.         }
  132.     }
  133. }

Developer Fusion