XLT格式化XML那点事(C#代码中的问题解决)(二)
接上篇《XML通过XSL格式化的那点事(XML到自定义节点折叠显示)》,本文就如何将大的XLST分割成小文件和如何用C#将XML通过XSL生成HTML文件中的问题做下分析,避免有同样需求的朋友走弯路。
Import的使用
<xsl:Import> 元素必须在第一个节点
如何避免输出SelfClose的非法元素
简单繁琐的办法
1 2 3 | < script type="text/javascript" src="nowhere.js"> < xsl:comment ></ xsl:comment > </ script > |
一劳永逸的方法
不用XMLWriter使用自己定义的XMLHTMLWriter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | using System; using System.Collections.Generic; using System.Text; using System.Xml; namespace XSLSelfClosing { public class XmlHtmlWriter : XmlTextWriter { public XmlHtmlWriter(System.IO.Stream stream, Encoding en) : base (stream, en) { //Put all the elemnts for which you want self closing tags in this list. //Rest of the tags would be explicitely closed fullyClosedElements.AddRange( new string [] { "br" , "hr" }); } string openingElement = "" ; List< string > fullyClosedElements = new List< string >(); public override void WriteEndElement() { if (fullyClosedElements.IndexOf(openingElement) < 0) WriteFullEndElement(); else base .WriteEndElement(); } public override void WriteStartElement( string prefix, string localName, string ns) { base .WriteStartElement(prefix, localName, ns); openingElement = localName; } } } |
XSL Copy 函数会为节点自动添加xmlns的问题
解决方法:
添加如下模板
1 2 3 4 5 6 7 8 9 10 | < xsl:template match="*" mode="copy-no-namespaces"> < xsl:element name="{local-name()}"> < xsl:copy-of select="@*"/> < xsl:apply-templates select="node()" mode="copy-no-namespaces"/> </ xsl:element > </ xsl:template > < xsl:template match="comment()| processing-instruction()" mode="copy-no-namespaces"> < xsl:copy /> </ xsl:template > |
应用示例,替换掉使用`Copy-of`的代码段
1 | < xsl:apply-templates select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf/sw8:CdtTrfTxInf" mode="copy-no-namespaces"/> |
参考
How to force Non-Self Closing tags for empty nodes when using XslCompiledTransform class
作者:旭东
出处:http://www.cnblogs.com/HQFZ
关于作者:专注于微软平台项目架构、管理和企业解决方案。现主要从事WinForm、ASP.NET、WPF、WCF、等方面的项目开发、架构、管理。如有问题或建议,请不吝指教!
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以联系我,非常感谢。
如果您该文觉得不错或者对你有帮助,请点下推荐,让更多的朋友看到,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?