/// <summary> /// Transforms to XmlWriter. /// </summary> protected void TransformToWriter(XmlInput defaultDocument, XsltArgumentList xsltArgs, XmlWriter targetWriter) { XmlWriter xmlWriter; if (this.supportCharacterMaps && this.characterMap != null && this.characterMap.Count > 0) { xmlWriter = new CharacterMappingXmlWriter(targetWriter, this.characterMap); } else { xmlWriter = targetWriter; } if (this.enforceXHTMLOutput) { xmlWriter = new XhtmlWriter(xmlWriter); } XsltArgumentList args = AddExsltExtensionObjectsSync(xsltArgs); XmlReader xmlReader = defaultDocument.source as XmlReader; if (xmlReader != null) { this.compiledTransform.Transform(xmlReader, args, xmlWriter, defaultDocument.resolver); return; } IXPathNavigable nav = defaultDocument.source as IXPathNavigable; if (nav != null) { if (defaultDocument.resolver is DefaultXmlResolver) { this.compiledTransform.Transform(nav, args, xmlWriter); } else { TransformIXPathNavigable(nav, args, xmlWriter, defaultDocument.resolver); } return; } string str = defaultDocument.source as string; if (str != null) { using (XmlReader reader = XmlReader.Create(str, GetReaderSettings(defaultDocument))) { this.compiledTransform.Transform(reader, args, xmlWriter, defaultDocument.resolver); } return; } Stream strm = defaultDocument.source as Stream; if (strm != null) { using (XmlReader reader = XmlReader.Create(strm, GetReaderSettings(defaultDocument))) { this.compiledTransform.Transform(reader, args, xmlWriter, defaultDocument.resolver); } return; } TextReader txtReader = defaultDocument.source as TextReader; if (txtReader != null) { using (XmlReader reader = XmlReader.Create(txtReader, GetReaderSettings(defaultDocument))) { this.compiledTransform.Transform(reader, args, xmlWriter, defaultDocument.resolver); } return; } throw new Exception("Unexpected XmlInput"); }
/// <summary> /// Gets XML Reader settings (customized if there is custom XML resolver) /// </summary> /// <returns></returns> protected XmlReaderSettings GetReaderSettings(XmlInput defaultDocument) { if (defaultDocument.resolver is DefaultXmlResolver) { return DefaultReaderSettings; } else { XmlReaderSettings settings = DefaultReaderSettings.Clone(); settings.XmlResolver = defaultDocument.resolver; return settings; } }
/// <summary> /// Transforms given <see cref="XmlInput"/> into <see cref="XmlReader"/>. /// </summary> /// <param name="input">Default input XML document</param> /// <param name="arguments">An <see cref="XsltArgumentList"/> containing the namespace-qualified /// arguments used as input to the transform. This value can be a null reference (Nothing in Visual Basic).</param> /// <param name="multiThread">Defines in which mode (multithreaded or singlethreaded) /// this instance of XslReader will operate</param> /// <param name="initialBufferSize">Initial buffer size (number of nodes, not bytes)</param> public XmlReader Transform(XmlInput input, XsltArgumentList arguments, bool multiThread, int initialBufferSize) { XslReader r = new XslReader(this.compiledTransform, multiThread, initialBufferSize); r.StartTransform(input, AddExsltExtensionObjectsSync(arguments)); return r; }
/// <summary> /// Transforms given <see cref="XmlInput"/> into <see cref="XmlReader"/>. /// </summary> /// <param name="input">Default input XML document</param> /// <param name="arguments">An <see cref="XsltArgumentList"/> containing the namespace-qualified /// arguments used as input to the transform. This value can be a null reference (Nothing in Visual Basic).</param> public XmlReader Transform(XmlInput input, XsltArgumentList arguments) { XslReader r = new XslReader(this.compiledTransform); r.StartTransform(input, AddExsltExtensionObjectsSync(arguments)); return r; }
/// <summary> /// Transforms given <see cref="XmlInput"/> into <see cref="XmlOutput"/>. /// The <see cref="XsltArgumentList"/> provides additional runtime arguments. /// </summary> /// <param name="input">Default input XML document.</param> /// <param name="arguments">An <see cref="XsltArgumentList"/> containing the namespace-qualified /// arguments used as input to the transform. This value can be a null reference (Nothing in Visual Basic).</param> /// <param name="output">Represents the transformation's output.</param> /// <returns>Transformation output.</returns> public XmlOutput Transform(XmlInput input, XsltArgumentList arguments, XmlOutput output) { if (input == null) throw new ArgumentNullException("defaltDocument"); XmlWriter xmlWriter = output.destination as XmlWriter; bool closeWriter = false; if (xmlWriter == null) { closeWriter = true; while (true) { TextWriter txtWriter = output.destination as TextWriter; if (txtWriter != null) { if (multiOutput) { MultiXmlTextWriter mw = new MultiXmlTextWriter(txtWriter, output.XmlResolver); if (this.compiledTransform.OutputSettings.Indent) { mw.Formatting = Formatting.Indented; } xmlWriter = mw; } else { xmlWriter = XmlWriter.Create(txtWriter, this.compiledTransform.OutputSettings); } break; } Stream strm = output.destination as Stream; if (strm != null) { if (multiOutput) { MultiXmlTextWriter mw = new MultiXmlTextWriter(strm, this.compiledTransform.OutputSettings.Encoding, output.XmlResolver); if (this.compiledTransform.OutputSettings.Indent) { mw.Formatting = Formatting.Indented; } xmlWriter = mw; } else { xmlWriter = XmlWriter.Create(strm, this.compiledTransform.OutputSettings); } break; } String str = output.destination as String; if (str != null) { if (multiOutput) { MultiXmlTextWriter mw = new MultiXmlTextWriter(str, this.compiledTransform.OutputSettings.Encoding); if (this.compiledTransform.OutputSettings.Indent) { mw.Formatting = Formatting.Indented; } xmlWriter = mw; } else { XmlWriterSettings outputSettings = this.compiledTransform.OutputSettings.Clone(); outputSettings.CloseOutput = true; // BugBug: We should read doc before creating output file in case they are the same xmlWriter = XmlWriter.Create(str, outputSettings); } break; } throw new Exception("Unexpected XmlOutput"); } } try { TransformToWriter(input, arguments, xmlWriter); } finally { if (closeWriter) { xmlWriter.Close(); } } return output; }
/// <summary> /// Starts XSL transformation of given <see cref="XmlInput"/> object with /// specified <see cref="XsltArgumentList"/>. After this method returns /// you can read the transformation output out of XslReader object via /// standard <see cref="XmlReader"/> methods such as Read() or MoveXXX(). /// </summary> /// <remarks>If the <c>StartTransform()</c> method is called when previous /// transformation isn't over yet, it will be aborted, buffer cleaned and /// XslReader object reset to an initial state automatically.</remarks> /// <param name="input">An input XML to be transformed</param> /// <param name="args">A collection of global parameter values and /// extension objects.</param> /// <returns></returns> public XmlReader StartTransform(XmlInput input, XsltArgumentList args) { this.defaulDocument = input; this.args = args; Start(); return this; }