1 //------------------------------------------------------------------------------
2 // <copyright file="CopyNodeSetAction.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">[....]</owner>
6 //------------------------------------------------------------------------------
8 namespace System.Xml.Xsl.XsltOld {
9 using Res = System.Xml.Utils.Res;
11 using System.Diagnostics;
13 using System.Xml.XPath;
15 internal sealed class CopyNodeSetAction : Action {
16 private const int BeginEvent = 2;
17 private const int Contents = 3;
18 private const int Namespaces = 4;
19 private const int Attributes = 5;
20 private const int Subtree = 6;
21 private const int EndEvent = 7;
23 private static CopyNodeSetAction s_Action = new CopyNodeSetAction();
25 internal static CopyNodeSetAction GetAction() {
26 Debug.Assert(s_Action != null);
30 internal override void Execute(Processor processor, ActionFrame frame) {
31 Debug.Assert(processor != null && frame != null);
32 while (processor.CanContinue) {
33 switch (frame.State) {
35 if (frame.NextNode(processor)) {
36 frame.State = BeginEvent;
44 Debug.Assert(frame.State == BeginEvent);
46 if (SendBeginEvent(processor, frame.Node) == false) {
47 // This one wasn't output
50 frame.State = Contents;
54 Debug.Assert(frame.State == Contents);
55 XPathNodeType nodeType = frame.Node.NodeType;
57 if (nodeType == XPathNodeType.Element || nodeType == XPathNodeType.Root) {
58 processor.PushActionFrame(CopyNamespacesAction.GetAction(), frame.NodeSet);
59 frame.State = Namespaces;
63 if (SendTextEvent(processor, frame.Node) == false) {
64 // This one wasn't output
67 frame.State = EndEvent;
71 processor.PushActionFrame(CopyAttributesAction.GetAction(), frame.NodeSet);
72 frame.State = Attributes;
76 if (frame.Node.HasChildren) {
77 processor.PushActionFrame(GetAction(), frame.Node.SelectChildren(XPathNodeType.All));
78 frame.State = Subtree;
81 frame.State = EndEvent;
85 //frame.Node.MoveToParent();
86 frame.State = EndEvent;
90 Debug.Assert(frame.State == EndEvent);
92 if (SendEndEvent(processor, frame.Node) == false) {
93 // This one wasn't output
97 frame.State = Initialized;
105 private static bool SendBeginEvent(Processor processor, XPathNavigator node) {
106 return processor.CopyBeginEvent(node, node.IsEmptyElement);
109 private static bool SendTextEvent(Processor processor, XPathNavigator node) {
110 return processor.CopyTextEvent(node);
113 private static bool SendEndEvent(Processor processor, XPathNavigator node) {
114 return processor.CopyEndEvent(node);