The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.XsltOld \ AttributeSetAction

  1. //------------------------------------------------------------------------------
  2. // <copyright file="AttributeSetAction.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Xml.Xsl.XsltOld
  16. {
  17.     using Res = System.Xml.Utils.Res;
  18.     using System;
  19.     using System.Diagnostics;
  20.     using System.Xml;
  21.     using System.Xml.XPath;
  22.     using System.Collections;
  23.    
  24.     internal class AttributeSetAction : ContainerAction
  25.     {
  26.         internal XmlQualifiedName name;
  27.        
  28.         internal XmlQualifiedName Name {
  29.             get { return this.name; }
  30.         }
  31.        
  32.         internal override void Compile(Compiler compiler)
  33.         {
  34.             CompileAttributes(compiler);
  35.             CheckRequiredAttribute(compiler, this.name, Keywords.s_Name);
  36.             CompileContent(compiler);
  37.         }
  38.        
  39.         internal override bool CompileAttribute(Compiler compiler)
  40.         {
  41.             string name = compiler.Input.LocalName;
  42.             string value = compiler.Input.Value;
  43.             if (Keywords.Equals(name, compiler.Atoms.Name)) {
  44.                 Debug.Assert(this.name == null);
  45.                 this.name = compiler.CreateXPathQName(value);
  46.             }
  47.             else if (Keywords.Equals(name, compiler.Atoms.UseAttributeSets)) {
  48.                 // create a UseAttributeSetsAction
  49.                 // sets come before xsl:attributes
  50.                 AddAction(compiler.CreateUseAttributeSetsAction());
  51.             }
  52.             else {
  53.                 return false;
  54.             }
  55.            
  56.             return true;
  57.         }
  58.        
  59.         private void CompileContent(Compiler compiler)
  60.         {
  61.             NavigatorInput input = compiler.Input;
  62.            
  63.             if (compiler.Recurse()) {
  64.                 do {
  65.                     switch (input.NodeType) {
  66.                         case XPathNodeType.Element:
  67.                             compiler.PushNamespaceScope();
  68.                            
  69.                             string nspace = input.NamespaceURI;
  70.                             string name = input.LocalName;
  71.                            
  72.                             if (Keywords.Equals(nspace, input.Atoms.XsltNamespace) && Keywords.Equals(name, input.Atoms.Attribute)) {
  73.                                 // found attribute so add it
  74.                                 AddAction(compiler.CreateAttributeAction());
  75.                             }
  76.                             else {
  77.                                 throw compiler.UnexpectedKeyword();
  78.                             }
  79.                             compiler.PopScope();
  80.                             break;
  81.                         case XPathNodeType.Comment:
  82.                         case XPathNodeType.ProcessingInstruction:
  83.                         case XPathNodeType.Whitespace:
  84.                         case XPathNodeType.SignificantWhitespace:
  85.                            
  86.                             break;
  87.                         default:
  88.                            
  89.                             throw XsltException.Create(Res.Xslt_InvalidContents, Keywords.s_AttributeSet);
  90.                             break;
  91.                     }
  92.                 }
  93.                 while (compiler.Advance());
  94.                
  95.                 compiler.ToParent();
  96.             }
  97.         }
  98.        
  99.         internal void Merge(AttributeSetAction attributeAction)
  100.         {
  101.             // add the contents of "attributeAction" to this action
  102.             // place them at the end
  103.             Action action;
  104.             int i = 0;
  105.            
  106.             while ((action = attributeAction.GetAction(i)) != null) {
  107.                 AddAction(action);
  108.                 i++;
  109.             }
  110.         }
  111.     }
  112. }

Developer Fusion