1 //------------------------------------------------------------------------------
2 // <copyright file="CallTemplateAction.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</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 class CallTemplateAction : ContainerAction {
16 private const int ProcessedChildren = 2;
17 private const int ProcessedTemplate = 3;
18 private XmlQualifiedName name;
20 internal override void Compile(Compiler compiler) {
21 CompileAttributes(compiler);
22 CheckRequiredAttribute(compiler, this.name, "name");
23 CompileContent(compiler);
26 internal override bool CompileAttribute(Compiler compiler) {
27 string name = compiler.Input.LocalName;
28 string value = compiler.Input.Value;
29 if (Ref.Equal(name, compiler.Atoms.Name)) {
30 Debug.Assert(this.name == null);
31 this.name = compiler.CreateXPathQName(value);
40 private void CompileContent(Compiler compiler) {
41 NavigatorInput input = compiler.Input;
43 if (compiler.Recurse()) {
45 switch(input.NodeType) {
46 case XPathNodeType.Element:
47 compiler.PushNamespaceScope();
48 string nspace = input.NamespaceURI;
49 string name = input.LocalName;
51 if (Ref.Equal(nspace, input.Atoms.UriXsl) && Ref.Equal(name, input.Atoms.WithParam)) {
52 WithParamAction par = compiler.CreateWithParamAction();
53 CheckDuplicateParams(par.Name);
57 throw compiler.UnexpectedKeyword();
61 case XPathNodeType.Comment:
62 case XPathNodeType.ProcessingInstruction:
63 case XPathNodeType.Whitespace:
64 case XPathNodeType.SignificantWhitespace:
67 throw XsltException.Create(Res.Xslt_InvalidContents, "call-template");
69 } while(compiler.Advance());
75 internal override void Execute(Processor processor, ActionFrame frame) {
76 Debug.Assert(processor != null && frame != null);
79 processor.ResetParams();
80 if (this.containedActions != null && this.containedActions.Count > 0) {
81 processor.PushActionFrame(frame);
82 frame.State = ProcessedChildren;
85 goto case ProcessedChildren;
86 case ProcessedChildren:
87 TemplateAction action = processor.Stylesheet.FindTemplate(this.name);
89 frame.State = ProcessedTemplate;
90 processor.PushActionFrame(action, frame.NodeSet);
94 throw XsltException.Create(Res.Xslt_InvalidCallTemplate, this.name.ToString());
96 case ProcessedTemplate:
100 Debug.Fail("Invalid CallTemplateAction execution state");