| File: System\Xml\Xsl\XsltOld\UseAttributeSetsAction.cs | Web Access |
| Project: src\runtime\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 UseAttributeSetsAction : CompiledAction { private XmlQualifiedName[]? _useAttributeSets; private string? _useString; private const int ProcessingSets = 2; internal XmlQualifiedName[]? UsedSets { get { return _useAttributeSets; } } internal override void Compile(Compiler compiler) { Debug.Assert(Ref.Equal(compiler.Input.LocalName, compiler.Atoms.UseAttributeSets)); _useString = compiler.Input.Value; Debug.Assert(_useAttributeSets == null); if (_useString.Length == 0) { // Split creates empty node is spliting empty string _useAttributeSets = Array.Empty<XmlQualifiedName>(); return; } string[] qnames = XmlConvert.SplitString(_useString); try { _useAttributeSets = new XmlQualifiedName[qnames.Length]; { for (int i = 0; i < qnames.Length; i++) { _useAttributeSets[i] = compiler.CreateXPathQName(qnames[i]); } } } catch (XsltException) { if (!compiler.ForwardCompatibility) { // Rethrow the exception if we're not in forwards-compatible mode throw; } // Ignore the whole list in forwards-compatible mode _useAttributeSets = Array.Empty<XmlQualifiedName>(); } } internal override void Execute(Processor processor, ActionFrame frame) { switch (frame.State) { case Initialized: frame.Counter = 0; frame.State = ProcessingSets; goto case ProcessingSets; case ProcessingSets: if (frame.Counter < _useAttributeSets!.Length) { AttributeSetAction action = processor.RootAction!.GetAttributeSet(_useAttributeSets[frame.Counter]); frame.IncrementCounter(); processor.PushActionFrame(action, frame.NodeSet); } else { frame.Finished(); } break; default: Debug.Fail("Invalid Container action execution state"); break; } } } }