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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="ChooseAction.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 class ChooseAction : ContainerAction
  24.     {
  25.         internal override void Compile(Compiler compiler)
  26.         {
  27.             CompileAttributes(compiler);
  28.            
  29.             if (compiler.Recurse()) {
  30.                 CompileConditions(compiler);
  31.                 compiler.ToParent();
  32.             }
  33.         }
  34.        
  35.         private void CompileConditions(Compiler compiler)
  36.         {
  37.             NavigatorInput input = compiler.Input;
  38.             bool when = false;
  39.             bool otherwise = false;
  40.            
  41.             do {
  42.                 switch (input.NodeType) {
  43.                     case XPathNodeType.Element:
  44.                         compiler.PushNamespaceScope();
  45.                         string nspace = input.NamespaceURI;
  46.                         string name = input.LocalName;
  47.                        
  48.                         if (Keywords.Equals(nspace, input.Atoms.XsltNamespace)) {
  49.                             IfAction action = null;
  50.                             if (Keywords.Equals(name, input.Atoms.When)) {
  51.                                 if (otherwise) {
  52.                                     throw XsltException.Create(Res.Xslt_WhenAfterOtherwise);
  53.                                 }
  54.                                 action = compiler.CreateIfAction(IfAction.ConditionType.ConditionWhen);
  55.                                 when = true;
  56.                             }
  57.                             else if (Keywords.Equals(name, input.Atoms.Otherwise)) {
  58.                                 if (otherwise) {
  59.                                     throw XsltException.Create(Res.Xslt_DupOtherwise);
  60.                                 }
  61.                                 action = compiler.CreateIfAction(IfAction.ConditionType.ConditionOtherwise);
  62.                                 otherwise = true;
  63.                             }
  64.                             else {
  65.                                 throw compiler.UnexpectedKeyword();
  66.                             }
  67.                             AddAction(action);
  68.                         }
  69.                         else {
  70.                             throw compiler.UnexpectedKeyword();
  71.                         }
  72.                         compiler.PopScope();
  73.                         break;
  74.                     case XPathNodeType.Comment:
  75.                     case XPathNodeType.ProcessingInstruction:
  76.                     case XPathNodeType.Whitespace:
  77.                     case XPathNodeType.SignificantWhitespace:
  78.                        
  79.                         break;
  80.                     default:
  81.                        
  82.                         throw XsltException.Create(Res.Xslt_InvalidContents, Keywords.s_Choose);
  83.                         break;
  84.                 }
  85.             }
  86.             while (compiler.Advance());
  87.             if (!when) {
  88.                 throw XsltException.Create(Res.Xslt_NoWhen);
  89.             }
  90.         }
  91.     }
  92. }

Developer Fusion