C#中使用XSLT将XML转换为HTML的最简单方法是什么?

21

XSLT 新手问题:请您填写下面 C# 代码片段中的空格:

public static string TransformXMLToHTML(string inputXml, string xsltString) {
  // insert code here to apply the transform specified by xsltString to inputXml 
  // and return the resultant HTML string.
  // You may assume that the xslt output type is HTML.
}
谢谢!
2个回答

45

这样怎么样:

public static string TransformXMLToHTML(string inputXml, string xsltString)
{
    XslCompiledTransform transform = new XslCompiledTransform();
    using(XmlReader reader = XmlReader.Create(new StringReader(xsltString))) {
        transform.Load(reader);
    }
    StringWriter results = new StringWriter();
    using(XmlReader reader = XmlReader.Create(new StringReader(inputXml))) {
        transform.Transform(reader, null, results);
    }
    return results.ToString();
}

请注意最好缓存并重复使用XslCompiledTransform,或者使用XslTransform代替(虽然它已标记为过时)。


马克,你是众人之中的王子。 :) - Shaul Behr
非常整洁简单。 - Chris
2
这个可以变得更简单。所有那些XML读取器都可以被实际文件位置所替代,例如:XslCompiledTransform transform = new XslCompiledTransform("file://"+xsltString)。 同时,transform还有一个版本,你可以使用"file://" + inputXml的技巧来传递文件位置 ;) - tecfield

4

仅仅是为了好玩,这是一个稍微不太优雅的版本,它实现了Marc建议的缓存机制:

    public static string TransformXMLToHTML(string inputXml, string xsltString)
    {
        XslCompiledTransform transform = GetAndCacheTransform(xsltString);
        StringWriter results = new StringWriter();
        using (XmlReader reader = XmlReader.Create(new StringReader(inputXml)))
        {
            transform.Transform(reader, null, results);
        }
        return results.ToString();
    }

    private static Dictionary<String, XslCompiledTransform> cachedTransforms = new Dictionary<string, XslCompiledTransform>();
    private static XslCompiledTransform GetAndCacheTransform(String xslt)
    {
        XslCompiledTransform transform;
        if (!cachedTransforms.TryGetValue(xslt, out transform))
        {
            transform = new XslCompiledTransform();
            using (XmlReader reader = XmlReader.Create(new StringReader(xslt)))
            {
                transform.Load(reader);
            }
            cachedTransforms.Add(xslt, transform);
        }
        return transform;
    }

你需要担心字典的线程安全/同步问题,但是大致上是这样的。 - Marc Gravell
我突然想到,将xsltString进行哈希处理并使用该哈希作为键可能是值得的。一些转换可能会变得非常大-没有理由在XslCompiledTransform中以已编译的形式存储它并再次用作键而产生额外的内存开销。 - Dathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接