XLT格式化XML那点事(C#代码中的问题解决)(二)

接上篇《XML通过XSL格式化的那点事(XML到自定义节点折叠显示)》,本文就如何将大的XLST分割成小文件和如何用C#将XML通过XSL生成HTML文件中的问题做下分析,避免有同样需求的朋友走弯路。

Import的使用

<xsl:Import> 元素必须在第一个节点

image

image

如何避免输出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"/>

 

参考

XSLT self-closing tags issue

How to force Non-Self Closing tags for empty nodes when using XslCompiledTransform class

How to mimic copy-namespaces=“no” in XSLT 1.0?

posted @   霍旭东  阅读(2109)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示