Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / XmlUtils / System / Xml / Xsl / XsltOld / TemplateAction.cs / 1 / TemplateAction.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml.Xsl.XsltOld { using Res = System.Xml.Utils.Res; using System; using System.Diagnostics; using System.Collections; using System.Xml; using System.Xml.XPath; using MS.Internal.Xml.XPath; using System.Globalization; internal class TemplateAction : TemplateBaseAction { private int matchKey = Compiler.InvalidQueryKey; private XmlQualifiedName name; private double priority = double.NaN; private XmlQualifiedName mode; private int templateId; private bool replaceNSAliasesDone; internal int MatchKey { get { return this.matchKey; } } internal XmlQualifiedName Name { get { return this.name; } } internal double Priority { get { return this.priority; } } internal XmlQualifiedName Mode { get { return this.mode; } } internal int TemplateId { get { return this.templateId; } set { Debug.Assert(this.templateId == 0); this.templateId = value; } } internal override void Compile(Compiler compiler) { CompileAttributes(compiler); if (this.matchKey == Compiler.InvalidQueryKey) { if (this.name == null) { throw XsltException.Create(Res.Xslt_TemplateNoAttrib); } if (this.mode != null ) { throw XsltException.Create(Res.Xslt_InvalidModeAttribute); } } compiler.BeginTemplate(this); if (compiler.Recurse()) { CompileParameters(compiler); CompileTemplate(compiler); compiler.ToParent(); } compiler.EndTemplate(); AnalyzePriority(compiler); } internal virtual void CompileSingle(Compiler compiler) { this.matchKey = compiler.AddQuery("/", /*allowVars:*/false, /*allowKey:*/true, /*pattern*/true); this.priority = Compiler.RootPriority; CompileOnceTemplate(compiler); } internal override bool CompileAttribute(Compiler compiler) { string name = compiler.Input.LocalName; string value = compiler.Input.Value; if (Keywords.Equals(name, compiler.Atoms.Match)) { Debug.Assert(this.matchKey == Compiler.InvalidQueryKey); this.matchKey = compiler.AddQuery(value, /*allowVars:*/false, /*allowKey:*/true, /*pattern*/true); } else if (Keywords.Equals(name, compiler.Atoms.Name)) { Debug.Assert(this.name == null); this.name = compiler.CreateXPathQName(value); } else if (Keywords.Equals(name, compiler.Atoms.Priority)) { Debug.Assert(Double.IsNaN(this.priority)); this.priority = XmlConvert.ToXPathDouble(value); if (double.IsNaN(this.priority) && ! compiler.ForwardCompatibility) { throw XsltException.Create(Res.Xslt_InvalidAttrValue, Keywords.s_Priority, value); } } else if (Keywords.Equals(name, compiler.Atoms.Mode)) { Debug.Assert(this.mode == null); if (compiler.AllowBuiltInMode && value == "*") { this.mode = Compiler.BuiltInMode; } else { this.mode = compiler.CreateXPathQName(value); } } else { return false; } return true; } private void AnalyzePriority(Compiler compiler) { NavigatorInput input = compiler.Input; if (!Double.IsNaN(this.priority) || this.matchKey == Compiler.InvalidQueryKey) { return; } // Split Unions: TheQuery theQuery = (TheQuery)compiler.QueryStore[this.MatchKey]; CompiledXpathExpr expr = (CompiledXpathExpr)theQuery.CompiledQuery; Query query = expr.QueryTree; UnionExpr union; while ((union = query as UnionExpr) != null) { Debug.Assert(!(union.qy2 is UnionExpr), "only qy1 can be union"); TemplateAction copy = this.CloneWithoutName(); compiler.QueryStore.Add(new TheQuery( new CompiledXpathExpr(union.qy2, expr.Expression, false), theQuery._ScopeManager )); copy.matchKey = compiler.QueryStore.Count - 1; copy.priority = union.qy2.XsltDefaultPriority; compiler.AddTemplate(copy); query = union.qy1; } if (expr.QueryTree != query) { // query was splitted and we need create new TheQuery for this template compiler.QueryStore[this.MatchKey] = new TheQuery( new CompiledXpathExpr(query, expr.Expression, false), theQuery._ScopeManager ); } this.priority = query.XsltDefaultPriority; } protected void CompileParameters(Compiler compiler) { NavigatorInput input = compiler.Input; do { switch(input.NodeType) { case XPathNodeType.Element: if (Keywords.Equals(input.NamespaceURI, input.Atoms.XsltNamespace) && Keywords.Equals(input.LocalName, input.Atoms.Param)) { compiler.PushNamespaceScope(); AddAction(compiler.CreateVariableAction(VariableType.LocalParameter)); compiler.PopScope(); continue; } else { return; } case XPathNodeType.Text: return; case XPathNodeType.SignificantWhitespace: this.AddEvent(compiler.CreateTextEvent()); continue; default : continue; } } while (input.Advance()); } // // Priority calculation plus template splitting // private TemplateAction CloneWithoutName() { TemplateAction clone = new TemplateAction(); { clone.containedActions = this.containedActions; clone.mode = this.mode; clone.variableCount = this.variableCount; clone.replaceNSAliasesDone = true; // We shouldn't replace NS in clones. } return clone; } internal override void ReplaceNamespaceAlias(Compiler compiler) { // if template has both name and match it will be twice caled by stylesheet to replace NS aliases. if (! replaceNSAliasesDone) { base.ReplaceNamespaceAlias(compiler); replaceNSAliasesDone = true; } } // // Execution // internal override void Execute(Processor processor, ActionFrame frame) { Debug.Assert(processor != null && frame != null); switch (frame.State) { case Initialized: if (this.variableCount > 0) { frame.AllocateVariables(this.variableCount); } if (this.containedActions != null && this.containedActions.Count > 0) { processor.PushActionFrame(frame); frame.State = ProcessingChildren; } else { frame.Finished(); } break; // Allow children to run case ProcessingChildren: frame.Finished(); break; default: Debug.Fail("Invalid Container action execution state"); break; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml.Xsl.XsltOld { using Res = System.Xml.Utils.Res; using System; using System.Diagnostics; using System.Collections; using System.Xml; using System.Xml.XPath; using MS.Internal.Xml.XPath; using System.Globalization; internal class TemplateAction : TemplateBaseAction { private int matchKey = Compiler.InvalidQueryKey; private XmlQualifiedName name; private double priority = double.NaN; private XmlQualifiedName mode; private int templateId; private bool replaceNSAliasesDone; internal int MatchKey { get { return this.matchKey; } } internal XmlQualifiedName Name { get { return this.name; } } internal double Priority { get { return this.priority; } } internal XmlQualifiedName Mode { get { return this.mode; } } internal int TemplateId { get { return this.templateId; } set { Debug.Assert(this.templateId == 0); this.templateId = value; } } internal override void Compile(Compiler compiler) { CompileAttributes(compiler); if (this.matchKey == Compiler.InvalidQueryKey) { if (this.name == null) { throw XsltException.Create(Res.Xslt_TemplateNoAttrib); } if (this.mode != null ) { throw XsltException.Create(Res.Xslt_InvalidModeAttribute); } } compiler.BeginTemplate(this); if (compiler.Recurse()) { CompileParameters(compiler); CompileTemplate(compiler); compiler.ToParent(); } compiler.EndTemplate(); AnalyzePriority(compiler); } internal virtual void CompileSingle(Compiler compiler) { this.matchKey = compiler.AddQuery("/", /*allowVars:*/false, /*allowKey:*/true, /*pattern*/true); this.priority = Compiler.RootPriority; CompileOnceTemplate(compiler); } internal override bool CompileAttribute(Compiler compiler) { string name = compiler.Input.LocalName; string value = compiler.Input.Value; if (Keywords.Equals(name, compiler.Atoms.Match)) { Debug.Assert(this.matchKey == Compiler.InvalidQueryKey); this.matchKey = compiler.AddQuery(value, /*allowVars:*/false, /*allowKey:*/true, /*pattern*/true); } else if (Keywords.Equals(name, compiler.Atoms.Name)) { Debug.Assert(this.name == null); this.name = compiler.CreateXPathQName(value); } else if (Keywords.Equals(name, compiler.Atoms.Priority)) { Debug.Assert(Double.IsNaN(this.priority)); this.priority = XmlConvert.ToXPathDouble(value); if (double.IsNaN(this.priority) && ! compiler.ForwardCompatibility) { throw XsltException.Create(Res.Xslt_InvalidAttrValue, Keywords.s_Priority, value); } } else if (Keywords.Equals(name, compiler.Atoms.Mode)) { Debug.Assert(this.mode == null); if (compiler.AllowBuiltInMode && value == "*") { this.mode = Compiler.BuiltInMode; } else { this.mode = compiler.CreateXPathQName(value); } } else { return false; } return true; } private void AnalyzePriority(Compiler compiler) { NavigatorInput input = compiler.Input; if (!Double.IsNaN(this.priority) || this.matchKey == Compiler.InvalidQueryKey) { return; } // Split Unions: TheQuery theQuery = (TheQuery)compiler.QueryStore[this.MatchKey]; CompiledXpathExpr expr = (CompiledXpathExpr)theQuery.CompiledQuery; Query query = expr.QueryTree; UnionExpr union; while ((union = query as UnionExpr) != null) { Debug.Assert(!(union.qy2 is UnionExpr), "only qy1 can be union"); TemplateAction copy = this.CloneWithoutName(); compiler.QueryStore.Add(new TheQuery( new CompiledXpathExpr(union.qy2, expr.Expression, false), theQuery._ScopeManager )); copy.matchKey = compiler.QueryStore.Count - 1; copy.priority = union.qy2.XsltDefaultPriority; compiler.AddTemplate(copy); query = union.qy1; } if (expr.QueryTree != query) { // query was splitted and we need create new TheQuery for this template compiler.QueryStore[this.MatchKey] = new TheQuery( new CompiledXpathExpr(query, expr.Expression, false), theQuery._ScopeManager ); } this.priority = query.XsltDefaultPriority; } protected void CompileParameters(Compiler compiler) { NavigatorInput input = compiler.Input; do { switch(input.NodeType) { case XPathNodeType.Element: if (Keywords.Equals(input.NamespaceURI, input.Atoms.XsltNamespace) && Keywords.Equals(input.LocalName, input.Atoms.Param)) { compiler.PushNamespaceScope(); AddAction(compiler.CreateVariableAction(VariableType.LocalParameter)); compiler.PopScope(); continue; } else { return; } case XPathNodeType.Text: return; case XPathNodeType.SignificantWhitespace: this.AddEvent(compiler.CreateTextEvent()); continue; default : continue; } } while (input.Advance()); } // // Priority calculation plus template splitting // private TemplateAction CloneWithoutName() { TemplateAction clone = new TemplateAction(); { clone.containedActions = this.containedActions; clone.mode = this.mode; clone.variableCount = this.variableCount; clone.replaceNSAliasesDone = true; // We shouldn't replace NS in clones. } return clone; } internal override void ReplaceNamespaceAlias(Compiler compiler) { // if template has both name and match it will be twice caled by stylesheet to replace NS aliases. if (! replaceNSAliasesDone) { base.ReplaceNamespaceAlias(compiler); replaceNSAliasesDone = true; } } // // Execution // internal override void Execute(Processor processor, ActionFrame frame) { Debug.Assert(processor != null && frame != null); switch (frame.State) { case Initialized: if (this.variableCount > 0) { frame.AllocateVariables(this.variableCount); } if (this.containedActions != null && this.containedActions.Count > 0) { processor.PushActionFrame(frame); frame.State = ProcessingChildren; } else { frame.Finished(); } break; // Allow children to run case ProcessingChildren: frame.Finished(); break; default: Debug.Fail("Invalid Container action execution state"); break; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TrackBar.cs
- PixelFormats.cs
- ShutDownListener.cs
- WhitespaceSignificantCollectionAttribute.cs
- GeneralTransform3DTo2DTo3D.cs
- DbSource.cs
- XmlImplementation.cs
- EventSetterHandlerConverter.cs
- RegexNode.cs
- ReferenceService.cs
- FontNameEditor.cs
- UnitySerializationHolder.cs
- DeploymentSection.cs
- ValidationEventArgs.cs
- WpfSharedXamlSchemaContext.cs
- SerialReceived.cs
- PenCursorManager.cs
- Hex.cs
- CloudCollection.cs
- EntityEntry.cs
- SeekStoryboard.cs
- ViewLoader.cs
- _ScatterGatherBuffers.cs
- TypeResolvingOptionsAttribute.cs
- DataPager.cs
- CodeIdentifier.cs
- TerminatorSinks.cs
- VisualTreeUtils.cs
- CompiledRegexRunnerFactory.cs
- FastPropertyAccessor.cs
- DataGridViewCellValidatingEventArgs.cs
- PageBuildProvider.cs
- Int32Storage.cs
- Binding.cs
- BitmapImage.cs
- DataGridSortCommandEventArgs.cs
- OdbcEnvironmentHandle.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- OdbcConnectionFactory.cs
- DateTimeSerializationSection.cs
- PropertySourceInfo.cs
- BoundConstants.cs
- TargetException.cs
- XmlDataLoader.cs
- PathSegmentCollection.cs
- LoginName.cs
- SchemaImporterExtension.cs
- MostlySingletonList.cs
- RuntimeTransactionHandle.cs
- _ScatterGatherBuffers.cs
- BinaryNode.cs
- EditingCoordinator.cs
- UmAlQuraCalendar.cs
- BitStack.cs
- ResourceDisplayNameAttribute.cs
- XmlSchemaAll.cs
- AdjustableArrowCap.cs
- Int32CAMarshaler.cs
- JoinTreeSlot.cs
- SimpleTextLine.cs
- GeneralTransform2DTo3DTo2D.cs
- ExpressionVisitor.cs
- CodeConditionStatement.cs
- ExtendedProtectionPolicy.cs
- SessionParameter.cs
- OdbcUtils.cs
- CachedBitmap.cs
- _emptywebproxy.cs
- DataSet.cs
- AssemblyCollection.cs
- EventMappingSettings.cs
- SmiGettersStream.cs
- WmlControlAdapter.cs
- RegexEditorDialog.cs
- Substitution.cs
- ToolStripSplitStackLayout.cs
- ProviderCommandInfoUtils.cs
- Set.cs
- LogWriteRestartAreaState.cs
- HttpHandlerAction.cs
- ServicePointManagerElement.cs
- OutKeywords.cs
- WsdlBuildProvider.cs
- TextEncodedRawTextWriter.cs
- SqlWriter.cs
- SslStream.cs
- XPathNodePointer.cs
- XmlAnyElementAttributes.cs
- SchemaExporter.cs
- RightsManagementProvider.cs
- StrongNameKeyPair.cs
- pingexception.cs
- WebColorConverter.cs
- ComEventsMethod.cs
- EventSchemaTraceListener.cs
- Vector3DConverter.cs
- ToolStripItemEventArgs.cs
- PasswordTextNavigator.cs
- EdmItemError.cs
- NavigationExpr.cs