如何在 C# 中应用 XSLT 样式表
Posted
技术标签:
【中文标题】如何在 C# 中应用 XSLT 样式表【英文标题】:How to apply an XSLT Stylesheet in C# 【发布时间】:2010-09-07 05:44:42 【问题描述】:我想使用 C# 将 XSLT 样式表应用于 XML 文档并将输出写入文件。
【问题讨论】:
其实,我认为这是一个很好的问题,你提供了一个很好的答案。提名重新开放。 我发现 Xslt 令人困惑,所以这对我有帮助 github.com/beto-rodriguez/SuperXml 【参考方案1】:我在这里找到了可能的答案:http://web.archive.org/web/20130329123237/http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63
来自文章:
XPathDocument myXPathDoc = new XPathDocument(myXmlFile) ;
XslTransform myXslTrans = new XslTransform() ;
myXslTrans.Load(myStyleSheet);
XmlTextWriter myWriter = new XmlTextWriter("result.html",null) ;
myXslTrans.Transform(myXPathDoc,null,myWriter) ;
编辑:
但我可信赖的编译器说,XslTransform
已过时:请改用XslCompiledTransform
:
XPathDocument myXPathDoc = new XPathDocument(myXmlFile) ;
XslCompiledTransform myXslTrans = new XslCompiledTransform();
myXslTrans.Load(myStyleSheet);
XmlTextWriter myWriter = new XmlTextWriter("result.html",null);
myXslTrans.Transform(myXPathDoc,null,myWriter);
【讨论】:
因为我采纳了你的一些答案来制作我要链接的课程,所以我想我会把它作为评论放在这里。希望它能为人们简化事情:dftr.ca/?p=318 我更喜欢这个解决方案而不是重载版本,因为您可以使用 DTD、Schemas 等设置 XmlReaderSettings 和 XmlWriterSettings。 我需要在 VB.NET 中执行此操作(这是我的“非规范”语言,我更喜欢 C#),您的回答导致了我的解决方案。谢谢【参考方案2】:根据达人的出色回答,请注意,通过使用适当的XslCompiledTransform.Transform overload,可以显着缩短此代码:
var myXslTrans = new XslCompiledTransform();
myXslTrans.Load("stylesheet.xsl");
myXslTrans.Transform("source.xml", "result.html");
(很抱歉冒充这个答案,但 cmets 中的code block
支持相当有限。)
在 VB.NET 中,您甚至不需要变量:
With New XslCompiledTransform()
.Load("stylesheet.xsl")
.Transform("source.xml", "result.html")
End With
【讨论】:
【参考方案3】:这里是 MSDN 上关于如何在 C# 中进行 XSL 转换的教程:
http://support.microsoft.com/kb/307322/en-us/
这里还有如何写文件:
http://support.microsoft.com/kb/816149/en-us
顺便说一句:如果您也想进行验证,这里有另一个教程(针对 DTD、XDR 和 XSD (=Schema)):
http://support.microsoft.com/kb/307379/en-us/
我添加这个只是为了提供更多信息。
【讨论】:
这是一个仅链接的答案。请包含链接页面的相关部分。 两个链接失效了。【参考方案4】:这可能对你有帮助
public static string TransformDocument(string doc, string stylesheetPath)
Func<string,XmlDocument> GetXmlDocument = (xmlContent) =>
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlContent);
return xmlDocument;
;
try
var document = GetXmlDocument(doc);
var style = GetXmlDocument(File.ReadAllText(stylesheetPath));
System.Xml.Xsl.XslCompiledTransform transform = new System.Xml.Xsl.XslCompiledTransform();
transform.Load(style); // compiled stylesheet
System.IO.StringWriter writer = new System.IO.StringWriter();
XmlReader xmlReadB = new XmlTextReader(new StringReader(document.DocumentElement.OuterXml));
transform.Transform(xmlReadB, null, writer);
return writer.ToString();
catch (Exception ex)
throw ex;
【讨论】:
doc和document.DocumentElement.OuterXml有什么区别?doc
被定义为string doc
是这个函数的参数,它被传递给Func<string,XmlDocument> GetXmlDocument
,它加载并返回XmlDocument
类型。 document.DocumentElement
是 XmlElement
类型的属性,OuterXml
是 XmlElement
的字符串属性,用于获取字符串。参考 [docs.microsoft.com/en-us/dotnet/api/…
正确答案是什么...它们之间没有区别,并且两者的值完全相同...因此您无需将doc反序列化为XmlDocument并使用OuterXml提取回相同的xml...
@sasjaq 正确答案是:Transform
方法以 15 种不同的形式被覆盖,您可以使用其中的任何一种。是的,它可以被称为Transform(string,string)
也不能使事情正确。 xslt
是起草的,但xml
是业务数据,Func
这里确保数据是正确的 xml,然后是盲目的。我在那里有一个记录器来记录它。请参阅转换 [docs.microsoft.com/en-us/dotnet/api/…以上是关于如何在 C# 中应用 XSLT 样式表的主要内容,如果未能解决你的问题,请参考以下文章
当我将 XSLT 样式表应用到 XML 文件时,啥也没有出现