File: System\Xml\Xsl\XsltOld\WithParamAction.cs
Web Access
Project: src\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections;
using System.Diagnostics;
using System.Xml;
using System.Xml.XPath;
 
namespace System.Xml.Xsl.XsltOld
{
    internal sealed class WithParamAction : VariableAction
    {
        internal WithParamAction() : base(VariableType.WithParameter) { }
 
        internal override void Compile(Compiler compiler)
        {
            CompileAttributes(compiler);
            CheckRequiredAttribute(this.name, "name");
            if (compiler.Recurse())
            {
                CompileTemplate(compiler);
                compiler.ToParent();
 
                if (this.selectKey != Compiler.InvalidQueryKey && this.containedActions != null)
                {
                    throw XsltException.Create(SR.Xslt_VariableCntSel2, this.nameStr);
                }
            }
        }
 
        internal override void Execute(Processor processor, ActionFrame frame)
        {
            Debug.Assert(processor != null && frame != null);
            object ParamValue;
            switch (frame.State)
            {
                case Initialized:
                    if (this.selectKey != Compiler.InvalidQueryKey)
                    {
                        ParamValue = processor.RunQuery(frame, this.selectKey);
                        processor.SetParameter(this.name!, ParamValue);
                        frame.Finished();
                    }
                    else
                    {
                        if (this.containedActions == null)
                        {
                            processor.SetParameter(this.name!, string.Empty);
                            frame.Finished();
                            break;
                        }
                        NavigatorOutput output = new NavigatorOutput(baseUri!);
                        processor.PushOutput(output);
                        processor.PushActionFrame(frame);
                        frame.State = ProcessingChildren;
                    }
                    break;
                case ProcessingChildren:
                    IRecordOutput recOutput = processor.PopOutput();
                    Debug.Assert(recOutput is NavigatorOutput);
                    processor.SetParameter(this.name!, ((NavigatorOutput)recOutput).Navigator);
                    frame.Finished();
                    break;
                default:
                    Debug.Fail("Invalid execution state inside VariableAction.Execute");
                    break;
            }
        }
    }
}