You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用System.Xml.Xsl转换XML到HTML,如何实现属性与节点均转义?

问题描述

我正在使用微软的System.Xml.Xsl生成HTML。在将包含转义序列(比如<script>)的XML转换为HTML时,发现当把节点内容作为属性输出时,该内容不会被转义。我希望生成的HTML中,属性和节点文本都能被正确转义。


XML示例

<Contact>
  <Name>hello &lt;script&gt;alert('!')&lt;/script&gt;</Name>
</Contact>

XSLT示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" doctype-system="html" />
<xsl:template match="/">
    <span data-title="{{ 'title': '{/Contact/Name}' }}">
        Name: <xsl:value-of select="/Contact/Name"/>
        Input: <input type="text" value="{/Contact/Name}"/>
    </span>
</xsl:template>
</xsl:stylesheet>

C#示例代码

using System;
using System.Xml;
using System.Xml.Xsl;
using System.IO;

public class Program
{
    public static void Main()
    {
        var transform = new XslCompiledTransform();
        var xml = @"<Contact><Name>hello &lt;script&gt;alert('!')&lt;/script&gt;</Name></Contact>";
        var xslt = @"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
<xsl:output method=""html"" indent=""yes"" doctype-system=""html"" />
<xsl:template match=""/"">
    <span data-title=""{{ 'title': '{/Contact/Name}' }}"" >
        Name: <xsl:value-of select=""/Contact/Name"" >
        Input: <input type=""text"" value=""{/Contact/Name}"">
    </span>
</xsl:template></xsl:stylesheet>
";

        transform.Load(XmlReader.Create(new StringReader(xslt)));
        var settings = transform.OutputSettings.Clone();
        using (var output = new MemoryStream())
        using (var writer = XmlWriter.Create(output, settings))
        {
            var args = new System.Xml.Xsl.XsltArgumentList();
            transform.Transform(XmlReader.Create(new StringReader(xml)), args, writer);
            writer.Flush();
            output.Position = 0;
            Console.Write(new StreamReader(output).ReadToEnd());
        }
    }
}

实际转换结果

<!DOCTYPE html SYSTEM "html"><span data-title="{ 'title': 'hello <script>alert('!')</script>' }">
        Name: hello &lt;script&gt;alert('!')&lt;/script&gt;
        Input: <input type="text" value="hello <script>alert('!')</script>"></span>

期望转换结果

<!DOCTYPE html SYSTEM "html">
<span data-title="{ 'title': 'hello &lt;script&gt;alert('!')&lt;/script&gt;' }">
        Name: hello &lt;script&gt;alert('!')&lt;/script&gt;
        Input: <input type="text" value="hello &lt;script&gt;alert('!')&lt;/script&gt;" /></span>

内容的提问来源于stack exchange,提问作者Eric Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:40:22