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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="CompiledAction.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.    
  23.     internal abstract class CompiledAction : Action
  24.     {
  25.         internal abstract void Compile(Compiler compiler);
  26.        
  27.         internal virtual bool CompileAttribute(Compiler compiler)
  28.         {
  29.             return false;
  30.         }
  31.        
  32.         public void CompileAttributes(Compiler compiler)
  33.         {
  34.             NavigatorInput input = compiler.Input;
  35.             string element = input.LocalName;
  36.            
  37.             if (input.MoveToFirstAttribute()) {
  38.                 do {
  39.                     if (!Keywords.Equals(input.NamespaceURI, input.Atoms.Empty))
  40.                         continue;
  41.                    
  42.                     try {
  43.                         if (CompileAttribute(compiler) == false) {
  44.                             throw XsltException.Create(Res.Xslt_InvalidAttribute, input.LocalName, element);
  45.                         }
  46.                     }
  47.                     catch {
  48.                         if (!compiler.ForwardCompatibility) {
  49.                             throw;
  50.                         }
  51.                         else {
  52.                             // In ForwardCompatibility mode we ignoreing all unknown or incorrect attributes
  53.                             // If it's mandatory attribute we'l notice it absents later.
  54.                         }
  55.                     }
  56.                 }
  57.                 while (input.MoveToNextAttribute());
  58.                 input.ToParent();
  59.             }
  60.         }
  61.        
  62.         // For perf reason we precalculating AVTs at compile time.
  63.         // If we can do this we set original AVT to null
  64.         static internal string PrecalculateAvt(ref Avt avt)
  65.         {
  66.             string result = null;
  67.             if (avt != null && avt.IsConstant) {
  68.                 result = avt.Evaluate(null, null);
  69.                 avt = null;
  70.             }
  71.             return result;
  72.         }
  73.        
  74.         public void CheckEmpty(Compiler compiler)
  75.         {
  76.             // Really EMPTY means no content at all, but the sake of compatibility with MSXML we allow whitespaces
  77.             string elementName = compiler.Input.Name;
  78.             if (compiler.Recurse()) {
  79.                 do {
  80.                     // Note: <![CDATA[ ]]> will be reported as XPathNodeType.Text
  81.                     XPathNodeType nodeType = compiler.Input.NodeType;
  82.                     if (nodeType != XPathNodeType.Whitespace && nodeType != XPathNodeType.Comment && nodeType != XPathNodeType.ProcessingInstruction) {
  83.                         throw XsltException.Create(Res.Xslt_NotEmptyContents, elementName);
  84.                     }
  85.                 }
  86.                 while (compiler.Advance());
  87.                 compiler.ToParent();
  88.             }
  89.         }
  90.        
  91.         public void CheckRequiredAttribute(Compiler compiler, object attrValue, string attrName)
  92.         {
  93.             CheckRequiredAttribute(compiler, attrValue != null, attrName);
  94.         }
  95.        
  96.         public void CheckRequiredAttribute(Compiler compiler, bool attr, string attrName)
  97.         {
  98.             if (!attr) {
  99.                 throw XsltException.Create(Res.Xslt_MissingAttribute, attrName);
  100.             }
  101.         }
  102.     }
  103. }

Developer Fusion