536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
103 lines
3.7 KiB
C#
103 lines
3.7 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="WriterOutput.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
// <owner current="true" primary="true">Microsoft</owner>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Xml.Xsl.XsltOld {
|
|
using Res = System.Xml.Utils.Res;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Xml;
|
|
using System.Xml.XPath;
|
|
using System.Collections;
|
|
|
|
internal class WriterOutput : RecordOutput {
|
|
private XmlWriter writer;
|
|
private Processor processor;
|
|
|
|
internal WriterOutput(Processor processor, XmlWriter writer) {
|
|
if (writer == null) {
|
|
throw new ArgumentNullException("writer");
|
|
}
|
|
|
|
this.writer = writer;
|
|
this.processor = processor;
|
|
}
|
|
|
|
// RecordOutput interface method implementation
|
|
//
|
|
public Processor.OutputResult RecordDone(RecordBuilder record) {
|
|
BuilderInfo mainNode = record.MainNode;
|
|
|
|
switch (mainNode.NodeType) {
|
|
case XmlNodeType.Element:
|
|
this.writer.WriteStartElement(mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI);
|
|
|
|
WriteAttributes(record.AttributeList, record.AttributeCount);
|
|
|
|
if (mainNode.IsEmptyTag) {
|
|
this.writer.WriteEndElement();
|
|
}
|
|
break;
|
|
case XmlNodeType.Text:
|
|
case XmlNodeType.Whitespace:
|
|
case XmlNodeType.SignificantWhitespace:
|
|
this.writer.WriteString(mainNode.Value);
|
|
break;
|
|
case XmlNodeType.CDATA:
|
|
Debug.Assert(false, "XSLT never gives us CDATA");
|
|
this.writer.WriteCData(mainNode.Value);
|
|
break;
|
|
case XmlNodeType.EntityReference:
|
|
this.writer.WriteEntityRef(mainNode.LocalName);
|
|
break;
|
|
case XmlNodeType.ProcessingInstruction:
|
|
this.writer.WriteProcessingInstruction(mainNode.LocalName, mainNode.Value);
|
|
break;
|
|
case XmlNodeType.Comment:
|
|
this.writer.WriteComment(mainNode.Value);
|
|
break;
|
|
case XmlNodeType.Document:
|
|
break;
|
|
case XmlNodeType.DocumentType:
|
|
this.writer.WriteRaw(mainNode.Value);
|
|
break;
|
|
case XmlNodeType.EndElement:
|
|
this.writer.WriteFullEndElement();
|
|
break;
|
|
|
|
case XmlNodeType.None:
|
|
case XmlNodeType.Attribute:
|
|
case XmlNodeType.Entity:
|
|
case XmlNodeType.Notation:
|
|
case XmlNodeType.DocumentFragment:
|
|
case XmlNodeType.EndEntity:
|
|
break;
|
|
default:
|
|
Debug.Fail("Invalid NodeType on output: " + mainNode.NodeType);
|
|
break;
|
|
}
|
|
|
|
record.Reset();
|
|
return Processor.OutputResult.Continue;
|
|
}
|
|
|
|
public void TheEnd() {
|
|
this.writer.Flush();
|
|
this.writer = null;
|
|
}
|
|
|
|
private void WriteAttributes(ArrayList list, int count) {
|
|
Debug.Assert(list.Count >= count);
|
|
for (int attrib = 0; attrib < count; attrib ++) {
|
|
Debug.Assert(list[attrib] is BuilderInfo);
|
|
BuilderInfo attribute = (BuilderInfo) list[attrib];
|
|
this.writer.WriteAttributeString(attribute.Prefix, attribute.LocalName, attribute.NamespaceURI, attribute.Value);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|