f29c63dd60d27649e08cd5bc2ef2f65fe9dfc59d
[mono.git] / mcs / class / referencesource / System.Data.SqlXml / System / Xml / Xsl / XsltOld / NavigatorOutput.cs
1 //------------------------------------------------------------------------------
2 // <copyright file="NavigatorOutput.cs" company="Microsoft">
3 //     Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>                                                                
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
7
8 namespace System.Xml.Xsl.XsltOld {
9     using Res = System.Xml.Utils.Res;
10     using System;
11     using System.Diagnostics; 
12     using System.Xml;
13     using System.Xml.XPath;
14     using MS.Internal.Xml.Cache;
15
16     internal class NavigatorOutput : RecordOutput {
17         private XPathDocument doc;
18         private int documentIndex;        
19         private XmlRawWriter wr;
20         
21         internal XPathNavigator Navigator {
22             get { return ((IXPathNavigable)doc).CreateNavigator(); }
23         }
24
25         internal NavigatorOutput(string baseUri) {
26             doc = new XPathDocument();
27             this.wr = doc.LoadFromWriter(XPathDocument.LoadFlags.AtomizeNames, baseUri);
28         }
29
30         public Processor.OutputResult RecordDone(RecordBuilder record) {
31             Debug.Assert(record != null);
32
33             BuilderInfo mainNode = record.MainNode;
34             documentIndex++;
35             switch(mainNode.NodeType) {
36                 case XmlNodeType.Element: {                    
37                     wr.WriteStartElement( mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI );
38                     for (int attrib = 0; attrib < record.AttributeCount; attrib ++) {
39                         documentIndex++;
40                         Debug.Assert(record.AttributeList[attrib] is BuilderInfo);
41                         BuilderInfo attrInfo = (BuilderInfo) record.AttributeList[attrib];
42                         if (attrInfo.NamespaceURI == XmlReservedNs.NsXmlNs) {
43                             if( attrInfo.Prefix.Length == 0 )
44                                 wr.WriteNamespaceDeclaration(string.Empty, attrInfo.Value );
45                             else
46                                 wr.WriteNamespaceDeclaration( attrInfo.LocalName, attrInfo.Value );                            
47                         }
48                         else {
49                             wr.WriteAttributeString( attrInfo.Prefix, attrInfo.LocalName, attrInfo.NamespaceURI, attrInfo.Value );
50                         }
51                     }
52
53                     wr.StartElementContent();
54
55                     if (mainNode.IsEmptyTag)
56                         wr.WriteEndElement( mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI );
57                     break;
58                 }
59
60                 case XmlNodeType.Text:
61                     wr.WriteString( mainNode.Value );
62                     break;
63                 case XmlNodeType.Whitespace:
64                     break;
65                 case XmlNodeType.SignificantWhitespace:
66                     wr.WriteString( mainNode.Value );
67                     break;
68
69                 case XmlNodeType.ProcessingInstruction:
70                     wr.WriteProcessingInstruction( mainNode.LocalName, mainNode.Value );
71                     break;
72                 case XmlNodeType.Comment:
73                     wr.WriteComment( mainNode.Value );
74                     break;
75
76                 case XmlNodeType.Document:
77                     break;
78
79                 case XmlNodeType.EndElement:
80                     wr.WriteEndElement( mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI );
81                     break;
82
83                 default:
84                     Debug.Fail("Invalid NodeType on output: " + mainNode.NodeType);
85                     break;
86             }
87             record.Reset();
88             return Processor.OutputResult.Continue;
89         }
90
91         public void TheEnd() {
92             wr.Close();
93         }
94     }
95 }