1 //------------------------------------------------------------------------------
2 // <copyright file="NavigatorOutput.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
8 namespace System.Xml.Xsl.XsltOld {
9 using Res = System.Xml.Utils.Res;
11 using System.Diagnostics;
13 using System.Xml.XPath;
14 using MS.Internal.Xml.Cache;
16 internal class NavigatorOutput : RecordOutput {
17 private XPathDocument doc;
18 private int documentIndex;
19 private XmlRawWriter wr;
21 internal XPathNavigator Navigator {
22 get { return ((IXPathNavigable)doc).CreateNavigator(); }
25 internal NavigatorOutput(string baseUri) {
26 doc = new XPathDocument();
27 this.wr = doc.LoadFromWriter(XPathDocument.LoadFlags.AtomizeNames, baseUri);
30 public Processor.OutputResult RecordDone(RecordBuilder record) {
31 Debug.Assert(record != null);
33 BuilderInfo mainNode = record.MainNode;
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 ++) {
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 );
46 wr.WriteNamespaceDeclaration( attrInfo.LocalName, attrInfo.Value );
49 wr.WriteAttributeString( attrInfo.Prefix, attrInfo.LocalName, attrInfo.NamespaceURI, attrInfo.Value );
53 wr.StartElementContent();
55 if (mainNode.IsEmptyTag)
56 wr.WriteEndElement( mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI );
60 case XmlNodeType.Text:
61 wr.WriteString( mainNode.Value );
63 case XmlNodeType.Whitespace:
65 case XmlNodeType.SignificantWhitespace:
66 wr.WriteString( mainNode.Value );
69 case XmlNodeType.ProcessingInstruction:
70 wr.WriteProcessingInstruction( mainNode.LocalName, mainNode.Value );
72 case XmlNodeType.Comment:
73 wr.WriteComment( mainNode.Value );
76 case XmlNodeType.Document:
79 case XmlNodeType.EndElement:
80 wr.WriteEndElement( mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI );
84 Debug.Fail("Invalid NodeType on output: " + mainNode.NodeType);
88 return Processor.OutputResult.Continue;
91 public void TheEnd() {