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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="ForEachAction.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.Collections;
  21.     using System.Xml;
  22.     using System.Xml.XPath;
  23.    
  24.     internal class ForEachAction : ContainerAction
  25.     {
  26.         private const int ProcessedSort = 2;
  27.         private const int ProcessNextNode = 3;
  28.         private const int PositionAdvanced = 4;
  29.         private const int ContentsProcessed = 5;
  30.        
  31.         private int selectKey = Compiler.InvalidQueryKey;
  32.         private ContainerAction sortContainer;
  33.        
  34.         internal override void Compile(Compiler compiler)
  35.         {
  36.             CompileAttributes(compiler);
  37.             CheckRequiredAttribute(compiler, selectKey != Compiler.InvalidQueryKey, Keywords.s_Select);
  38.            
  39.             compiler.CanHaveApplyImports = false;
  40.             if (compiler.Recurse()) {
  41.                 CompileSortElements(compiler);
  42.                 CompileTemplate(compiler);
  43.                 compiler.ToParent();
  44.             }
  45.         }
  46.        
  47.         internal override bool CompileAttribute(Compiler compiler)
  48.         {
  49.             string name = compiler.Input.LocalName;
  50.             string value = compiler.Input.Value;
  51.             if (Keywords.Equals(name, compiler.Atoms.Select)) {
  52.                 this.selectKey = compiler.AddQuery(value);
  53.             }
  54.             else {
  55.                 return false;
  56.             }
  57.            
  58.             return true;
  59.         }
  60.        
  61.         internal override void Execute(Processor processor, ActionFrame frame)
  62.         {
  63.             Debug.Assert(processor != null && frame != null);
  64.            
  65.             switch (frame.State) {
  66.                 case Initialized:
  67.                     if (sortContainer != null) {
  68.                         processor.InitSortArray();
  69.                         processor.PushActionFrame(sortContainer, frame.NodeSet);
  70.                         frame.State = ProcessedSort;
  71.                         break;
  72.                     }
  73.                     goto case ProcessedSort;
  74.                     break;
  75.                 case ProcessedSort:
  76.                     frame.InitNewNodeSet(processor.StartQuery(frame.NodeSet, this.selectKey));
  77.                     if (sortContainer != null) {
  78.                         Debug.Assert(processor.SortArray.Count != 0);
  79.                         frame.SortNewNodeSet(processor, processor.SortArray);
  80.                     }
  81.                     frame.State = ProcessNextNode;
  82.                     goto case ProcessNextNode;
  83.                     break;
  84.                 case ProcessNextNode:
  85.                    
  86.                     Debug.Assert(frame.State == ProcessNextNode);
  87.                     Debug.Assert(frame.NewNodeSet != null);
  88.                    
  89.                     if (frame.NewNextNode(processor)) {
  90.                         frame.State = PositionAdvanced;
  91.                         goto case PositionAdvanced;
  92.                     }
  93.                     else {
  94.                         frame.Finished();
  95.                         break;
  96.                     }
  97.                     break;
  98.                 case PositionAdvanced:
  99.                    
  100.                     processor.PushActionFrame(frame, frame.NewNodeSet);
  101.                     frame.State = ContentsProcessed;
  102.                     break;
  103.                 case ContentsProcessed:
  104.                    
  105.                     frame.State = ProcessNextNode;
  106.                     goto case ProcessNextNode;
  107.                     break;
  108.             }
  109.         }
  110.        
  111.         protected void CompileSortElements(Compiler compiler)
  112.         {
  113.             NavigatorInput input = compiler.Input;
  114.             do {
  115.                 switch (input.NodeType) {
  116.                     case XPathNodeType.Element:
  117.                         if (Keywords.Equals(input.NamespaceURI, input.Atoms.XsltNamespace) && Keywords.Equals(input.LocalName, input.Atoms.Sort)) {
  118.                             if (sortContainer == null) {
  119.                                 sortContainer = new ContainerAction();
  120.                             }
  121.                             sortContainer.AddAction(compiler.CreateSortAction());
  122.                             continue;
  123.                         }
  124.                         return;
  125.                     case XPathNodeType.Text:
  126.                         return;
  127.                     case XPathNodeType.SignificantWhitespace:
  128.                         this.AddEvent(compiler.CreateTextEvent());
  129.                         continue;
  130.                     default:
  131.                         continue;
  132.                 }
  133.             }
  134.             while (input.Advance());
  135.         }
  136.     }
  137. }

Developer Fusion