如何在 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&lt;string,XmlDocument&gt; GetXmlDocument,它加载并返回XmlDocument 类型。 document.DocumentElementXmlElement 类型的属性,OuterXmlXmlElement 的字符串属性,用于获取字符串。参考 [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 样式表填充现有 Excel 工作表吗?

可以将 XSLT 样式表添加到序列化的 XML 文档吗?

当我将 XSLT 样式表应用到 XML 文件时,啥也没有出现

将 XSLT 样式表应用于亚马逊产品广告 API XML 输出

XSLT:将样式表包含在主样式表中

如何将标题添加到由 XSLT 样式表转换的 HTML?