1.简介
Extensible Stylesheet Language Transformations (XSLT) 扩展样式语言转换。可以将一种格式xml转换成另一种格式xml
https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms256069(v=vs.100)
原始xml文档如下:
其中,genre表示类别 ,下级movie 表示电影,movie含有两个属性(名称和发行年份)
2.word2007
https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee872374(v=office.12)?redirectedfrom=MSDN
打开word并添加模板文字,并保存
将word添加后缀名wordTemplate.docx.zip,用压缩工具打开,将里面的document.xml复制出来。
添加文件名后缀【.xslt】:document.xml.xslt,然后用文本编辑工具打开。
添加<xsl:stylesheet>标签
将<w:document>标签的内容简化(因为很多内容我们是不知道,也不需要的,为了方便查看,只保留w空间下的标签,即 w:body,w:p,w:r之类的)
添加<xsl:for-each>和<xsl:value-of >两个标签,用来替换原有模板(因为例子xml数据中,存在两个嵌套,所以用两个for-each)
完成后保存,即我们的xslt模板就建立好了
安装Open xml SDK:http://www.microsoft.com/downloads/details.aspx?familyid=c6e744e5-36e9-45f5-8d8c-331df206e0d0&displaylang=en
visual studio里添加引用
添加代码
//读取xslt 扩展样式语言转换表 XslCompiledTransform transform = new XslCompiledTransform(); FileStream fs = new FileStream("document.xml.xslt", FileMode.Open); transform.Load(new XmlTextReader(fs)); //结果数据 StringWriter stringWriter = new StringWriter(); XmlWriter xw = XmlWriter.Create(stringWriter); //转换 transform.Transform("XMLFile1.xml", xw); XmlDocument newWordContent = new XmlDocument(); newWordContent.LoadXml(stringWriter.ToString()); using (WordprocessingDocument output = WordprocessingDocument.Create("output.docx", WordprocessingDocumentType.Document)) { var mainPart = output.AddMainDocumentPart(); mainPart.Document = new Document(); Body updatedBodyContent = new Body(newWordContent.DocumentElement.InnerXml); //Replace the existing Document Body with the new content. output.MainDocumentPart.Document.Body = updatedBodyContent; //Save the updated output document. output.MainDocumentPart.Document.Save(); }
效果:
3.word2003
2003和2007不同,2007是压缩包,而word2003可以直接读取xml格式文件。
参考文档:https://dradisframework.com/support/guides/reporting/xslt_reports.html
https://www.cnblogs.com/yxli2008/p/11073549.html
步骤跟2007类似:
新建word,编辑模板及样式,另存为,选择我认得 2003 xml文档:
其他步骤一样
代码:
Assembly executingAssembly = Assembly.GetExecutingAssembly(); Stream manifestResourceStream = executingAssembly.GetManifestResourceStream("模板生成Word_2013.wordTemplate2013.xml.xslt"); XslCompiledTransform xslCompiledTransform = new XslCompiledTransform(false); xslCompiledTransform.Load(new XmlTextReader(manifestResourceStream)); FileInfo fileInfo = new FileInfo("aaa.doc"); StreamWriter streamWriter = fileInfo.CreateText(); xslCompiledTransform.Transform("XMLFile1.xml", null, streamWriter); streamWriter.Close();
4.源码
个人更推荐用2003,因为更简单,不需要Open xmlSdk,且结构更简单。
https://files.cnblogs.com/files/lizhijian/20201028xslt%E6%A8%A1%E6%9D%BF%E7%94%9F%E6%88%90word.rar