C# XSLT 转换器使用自闭 HTML 标签,这些标签无效
C# XSLT transformer uses self closing HTML tags which are invalid
我想使用 C# 将 xml 字符串转换为带有 xslt 的 html 字符串。但是,一些标签被转换为自关闭。实际上,这是 XSLT self-closing tags issue and Prevent XslCompiledTransform from using self-closing tags 的副本。不幸的是,无法使其与给他们的答案一起使用。下面是一个最小的 fiddle.
https://dotnetfiddle.net/zsqent
当前输出为
<div>
<div class="test" />
<i class="test" />
</div>
而我需要它
<div>
<div class="test"></div>
<i class="test"></i>
</div>
以防 fiddle 被删除,这里是它的副本
using System;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Xsl;
public class Program
{
public static void Main()
{
var xml = @"<a href=""#"" target=""_blank"">Click here</a>";
var xsl = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
<xsl:strip-space elements=""*"" />
<xsl:template match=""/"">
<div>
<div class=""test""></div>
<i class=""test""></i>
</div>
</xsl:template>
</xsl:stylesheet>";
var html = TransformXml(xml, xsl);
Console.WriteLine(html);
}
public static string TransformXml(string xml, string xslt)
{
var transformedDocument = new XDocument();
using (var xsltStringReader = new StringReader(xslt))
{
var xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.DtdProcessing = DtdProcessing.Parse;
using (XmlReader xsltReader = XmlReader.Create(xsltStringReader, xmlReaderSettings))
{
var transformer = new XslCompiledTransform();
transformer.Load(xsltReader);
using (var xmlStringReader = new StringReader(xml))
{
using (XmlReader xmlReader = XmlReader.Create(xmlStringReader, xmlReaderSettings))
{
using (XmlWriter newDocumentWriter = transformedDocument.CreateWriter())
{
transformer.Transform(xmlReader, newDocumentWriter);
}
}
}
}
}
return transformedDocument.ToString();
}
}
请尝试以下解决方案。
XSLT 属性可以使用单引号。
(1) XSLT输出子句应该如下:
<xsl:output indent='yes' media-type='text/html' method='html' omit-xml-declaration='yes' encoding='UTF-8' />
(2) 要使用的重要参数:xsl.OutputSettings
。否则,不会考虑 XSLT 设置。
c#
public static string TransformXml(string xml, string xslt)
{
string output = String.Empty;
using (StringReader srt = new StringReader(xslt))
using (StringReader sri = new StringReader(xml))
{
using (XmlReader xrt = XmlReader.Create(srt))
using (XmlReader xri = XmlReader.Create(sri))
{
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(xrt);
using (StringWriter sw = new StringWriter())
using (XmlWriter xwo = XmlWriter.Create(sw, xsl.OutputSettings)) // use OutputSettings of xsl, so it can be output as HTML
{
xsl.Transform(xri, xwo);
output = sw.ToString();
}
}
}
return output;
}
我想使用 C# 将 xml 字符串转换为带有 xslt 的 html 字符串。但是,一些标签被转换为自关闭。实际上,这是 XSLT self-closing tags issue and Prevent XslCompiledTransform from using self-closing tags 的副本。不幸的是,无法使其与给他们的答案一起使用。下面是一个最小的 fiddle.
https://dotnetfiddle.net/zsqent
当前输出为
<div>
<div class="test" />
<i class="test" />
</div>
而我需要它
<div>
<div class="test"></div>
<i class="test"></i>
</div>
以防 fiddle 被删除,这里是它的副本
using System;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Xsl;
public class Program
{
public static void Main()
{
var xml = @"<a href=""#"" target=""_blank"">Click here</a>";
var xsl = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
<xsl:strip-space elements=""*"" />
<xsl:template match=""/"">
<div>
<div class=""test""></div>
<i class=""test""></i>
</div>
</xsl:template>
</xsl:stylesheet>";
var html = TransformXml(xml, xsl);
Console.WriteLine(html);
}
public static string TransformXml(string xml, string xslt)
{
var transformedDocument = new XDocument();
using (var xsltStringReader = new StringReader(xslt))
{
var xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.DtdProcessing = DtdProcessing.Parse;
using (XmlReader xsltReader = XmlReader.Create(xsltStringReader, xmlReaderSettings))
{
var transformer = new XslCompiledTransform();
transformer.Load(xsltReader);
using (var xmlStringReader = new StringReader(xml))
{
using (XmlReader xmlReader = XmlReader.Create(xmlStringReader, xmlReaderSettings))
{
using (XmlWriter newDocumentWriter = transformedDocument.CreateWriter())
{
transformer.Transform(xmlReader, newDocumentWriter);
}
}
}
}
}
return transformedDocument.ToString();
}
}
请尝试以下解决方案。
XSLT 属性可以使用单引号。
(1) XSLT输出子句应该如下:
<xsl:output indent='yes' media-type='text/html' method='html' omit-xml-declaration='yes' encoding='UTF-8' />
(2) 要使用的重要参数:xsl.OutputSettings
。否则,不会考虑 XSLT 设置。
c#
public static string TransformXml(string xml, string xslt)
{
string output = String.Empty;
using (StringReader srt = new StringReader(xslt))
using (StringReader sri = new StringReader(xml))
{
using (XmlReader xrt = XmlReader.Create(srt))
using (XmlReader xri = XmlReader.Create(sri))
{
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(xrt);
using (StringWriter sw = new StringWriter())
using (XmlWriter xwo = XmlWriter.Create(sw, xsl.OutputSettings)) // use OutputSettings of xsl, so it can be output as HTML
{
xsl.Transform(xri, xwo);
output = sw.ToString();
}
}
}
return output;
}