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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="CopyOfAction.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.     using MS.Internal.Xml.XPath;
  23.    
  24.     internal class CopyOfAction : CompiledAction
  25.     {
  26.         private const int ResultStored = 2;
  27.         private const int NodeSetCopied = 3;
  28.        
  29.         private int selectKey = Compiler.InvalidQueryKey;
  30.        
  31.         internal override void Compile(Compiler compiler)
  32.         {
  33.             CompileAttributes(compiler);
  34.             CheckRequiredAttribute(compiler, selectKey != Compiler.InvalidQueryKey, Keywords.s_Select);
  35.             CheckEmpty(compiler);
  36.         }
  37.        
  38.         internal override bool CompileAttribute(Compiler compiler)
  39.         {
  40.             string name = compiler.Input.LocalName;
  41.             string value = compiler.Input.Value;
  42.             if (Keywords.Equals(name, compiler.Atoms.Select)) {
  43.                 this.selectKey = compiler.AddQuery(value);
  44.             }
  45.             else {
  46.                 return false;
  47.             }
  48.            
  49.             return true;
  50.         }
  51.        
  52.         internal override void Execute(Processor processor, ActionFrame frame)
  53.         {
  54.             Debug.Assert(processor != null && frame != null);
  55.            
  56.             switch (frame.State) {
  57.                 case Initialized:
  58.                     Debug.Assert(frame.NodeSet != null);
  59.                     Query query = processor.GetValueQuery(this.selectKey);
  60.                     object result = query.Evaluate(frame.NodeSet);
  61.                    
  62.                     if (result is XPathNodeIterator) {
  63.                         processor.PushActionFrame(CopyNodeSetAction.GetAction(), new XPathArrayIterator(query));
  64.                         frame.State = NodeSetCopied;
  65.                         break;
  66.                     }
  67.                    
  68.                     XPathNavigator nav = result as XPathNavigator;
  69.                     if (nav != null) {
  70.                         processor.PushActionFrame(CopyNodeSetAction.GetAction(), new XPathSingletonIterator(nav));
  71.                         frame.State = NodeSetCopied;
  72.                         break;
  73.                     }
  74.                    
  75.                     string value = XmlConvert.ToXPathString(result);
  76.                     if (processor.TextEvent(value)) {
  77.                         frame.Finished();
  78.                     }
  79.                     else {
  80.                         frame.StoredOutput = value;
  81.                         frame.State = ResultStored;
  82.                     }
  83.                     break;
  84.                 case ResultStored:
  85.                    
  86.                     Debug.Assert(frame.StoredOutput != null);
  87.                     processor.TextEvent(frame.StoredOutput);
  88.                     frame.Finished();
  89.                     break;
  90.                 case NodeSetCopied:
  91.                    
  92.                     Debug.Assert(frame.State == NodeSetCopied);
  93.                     frame.Finished();
  94.                     break;
  95.             }
  96.         }
  97.     }
  98. }

Developer Fusion