使用System.Xml.Xsl转换XML到HTML,如何实现属性与节点均转义?
问题描述
我正在使用微软的System.Xml.Xsl生成HTML。在将包含转义序列(比如<script>)的XML转换为HTML时,发现当把节点内容作为属性输出时,该内容不会被转义。我希望生成的HTML中,属性和节点文本都能被正确转义。
XML示例
<Contact> <Name>hello <script>alert('!')</script></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 <script>alert('!')</script></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 <script>alert('!')</script> Input: <input type="text" value="hello <script>alert('!')</script>"></span>
期望转换结果
<!DOCTYPE html SYSTEM "html"> <span data-title="{ 'title': 'hello <script>alert('!')</script>' }"> Name: hello <script>alert('!')</script> Input: <input type="text" value="hello <script>alert('!')</script>" /></span>
内容的提问来源于stack exchange,提问作者Eric Patrick
相关产品推荐
相关产品推荐

