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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="NavigatorOutput.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 MS.Internal.Xml.Cache;
  23.    
  24.     internal class NavigatorOutput : RecordOutput
  25.     {
  26.         private XPathDocument doc;
  27.         private int documentIndex;
  28.         private XmlRawWriter wr;
  29.        
  30.         internal XPathNavigator Navigator {
  31.             get { return ((IXPathNavigable)doc).CreateNavigator(); }
  32.         }
  33.        
  34.         internal NavigatorOutput(string baseUri)
  35.         {
  36.             doc = new XPathDocument();
  37.             this.wr = doc.LoadFromWriter(XPathDocument.LoadFlags.AtomizeNames, baseUri);
  38.         }
  39.        
  40.         public Processor.OutputResult RecordDone(RecordBuilder record)
  41.         {
  42.             Debug.Assert(record != null);
  43.            
  44.             BuilderInfo mainNode = record.MainNode;
  45.             documentIndex++;
  46.             switch (mainNode.NodeType) {
  47.                 case XmlNodeType.Element:
  48.                    
  49.                     {
  50.                         wr.WriteStartElement(mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI);
  51.                         for (int attrib = 0; attrib < record.AttributeCount; attrib++) {
  52.                             documentIndex++;
  53.                             Debug.Assert(record.AttributeList[attrib] is BuilderInfo);
  54.                             BuilderInfo attrInfo = (BuilderInfo)record.AttributeList[attrib];
  55.                             if (attrInfo.NamespaceURI == Keywords.s_XmlnsNamespace) {
  56.                                 if (attrInfo.Prefix.Length == 0)
  57.                                     wr.WriteNamespaceDeclaration(string.Empty, attrInfo.Value);
  58.                                 else
  59.                                     wr.WriteNamespaceDeclaration(attrInfo.LocalName, attrInfo.Value);
  60.                             }
  61.                             else {
  62.                                 wr.WriteAttributeString(attrInfo.Prefix, attrInfo.LocalName, attrInfo.NamespaceURI, attrInfo.Value);
  63.                             }
  64.                         }
  65.                        
  66.                         wr.StartElementContent();
  67.                        
  68.                         if (mainNode.IsEmptyTag)
  69.                             wr.WriteEndElement(mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI);
  70.                         break;
  71.                     }
  72.                     break;
  73.                 case XmlNodeType.Text:
  74.                    
  75.                     wr.WriteString(mainNode.Value);
  76.                     break;
  77.                 case XmlNodeType.Whitespace:
  78.                     break;
  79.                 case XmlNodeType.SignificantWhitespace:
  80.                     wr.WriteString(mainNode.Value);
  81.                     break;
  82.                 case XmlNodeType.ProcessingInstruction:
  83.                    
  84.                     wr.WriteProcessingInstruction(mainNode.LocalName, mainNode.Value);
  85.                     break;
  86.                 case XmlNodeType.Comment:
  87.                     wr.WriteComment(mainNode.Value);
  88.                     break;
  89.                 case XmlNodeType.Document:
  90.                    
  91.                     break;
  92.                 case XmlNodeType.EndElement:
  93.                    
  94.                     wr.WriteEndElement(mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI);
  95.                     break;
  96.                 default:
  97.                    
  98.                     Debug.Fail("Invalid NodeType on output: " + mainNode.NodeType);
  99.                     break;
  100.             }
  101.             record.Reset();
  102.             return Processor.OutputResult.Continue;
  103.         }
  104.        
  105.         public void TheEnd()
  106.         {
  107.             wr.Close();
  108.         }
  109.     }
  110. }

Developer Fusion