Word的XSLT转换

时间:2013-04-19 18:42:35

标签: c# xslt ms-word

我正在.NET C#中编写一个Web服务,它接受一个对象,将其转换为xml,应用XSLT模板,运行转换,并返回一个MS工作文件。

以下是该函数的代码:

public static HttpResponseMessage Transform(object data)
{
    var response = new HttpResponseMessage(HttpStatusCode.OK);

    StringWriter stringWriter = new StringWriter();
    XmlWriter xmlWriter = XmlWriter.Create(stringWriter);

    var applicationDirectory = AppDomain.CurrentDomain.BaseDirectory;
    var xsltPath = applicationDirectory + @"\Reporting\Files\Template.xslt";
    var templatePath = applicationDirectory + @"\Reporting\Files\Template.docx";

    var xmlObject = new System.Xml.Serialization.XmlSerializer(data.GetType());
    MemoryStream stream;
    using (stream = new MemoryStream())
    {
        var sw = new StreamWriter(stream);
        xmlObject.Serialize(stream, data);
        stream.Position = 0;


        XslCompiledTransform transform = new XslCompiledTransform();
        transform.Load(xsltPath);

        using (XmlReader xmlReader = XmlReader.Create(stream))
        {
            transform.Transform(xmlReader, xmlWriter);

            XmlDocument newWordContent = new XmlDocument();
            newWordContent.LoadXml(stringWriter.ToString());

            var outputPath = applicationDirectory + @"\Reporting\Temp\temp.docx";

            System.IO.File.Copy(templatePath, outputPath, true);

            using (WordprocessingDocument output = WordprocessingDocument.Open(outputPath, true))
            {
                Body updatedBodyContent = new Body(newWordContent.DocumentElement.InnerXml);

                output.MainDocumentPart.Document.Body = updatedBodyContent;

                output.MainDocumentPart.Document.Save();
            }

            response.Content = new StreamContent(new FileStream(outputPath, FileMode.Open, FileAccess.Read));
            response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            response.Content.Headers.ContentDisposition.FileName = outputPath;
        }
    }
    return response;
}

当我提出请求时,它会给我一个没有数据的word文件。

我在使用时设置了一个断点(XmlReader xmlReader = XmlReader.Create(stream))。 运行该行后,xmlReader的值为{None}。

我也试图避免为了提高效率而创建一个XML文件(因此就是MemoryStream)。

知道为什么这不起作用?有没有更好的方法来实现这个目标?

谢谢, 格

1 个答案:

答案 0 :(得分:0)

如果你改变了这一点会发生什么:

   Body updatedBodyContent = new Body(newWordContent.DocumentElement.InnerXml);

到此:

   Body updatedBodyContent = new Body(newWordContent.InnerXml);

或者这个:

   Body updatedBodyContent = new Body(newWordContent.DocumentElement.OuterXml);

你拥有它的方式将导致转换的XML的外部元素被省略,我怀疑这是你想要的(虽然不能肯定地说,因为你没有向我们展示输入XML或XSLT