使用C#进行html到XSLT的转换

时间:2012-01-06 17:10:34

标签: c# html xml regex xslt

我正在尝试使用C#将html页面更改为xslt页面, 例如,如果我有类似

的东西
<a href="#compantnameURL#">#companyname#</a>

我必须将其转换为

<a href="{test/companynameURL}"><xsl:value-of select="test/companyname" /></a>

我有一个xsl文件,其中包含所有这些值。我不想替换这里的值,因为在替换原始值之前需要进一步处理它们。 我在这里遇到的问题是,如果值在标签的属性级别或标签的值级别中,我很难识别(替换xml构造)。

我正在尝试使用正则表达式。有人可以帮忙??

2 个答案:

答案 0 :(得分:1)

Html Agility Pack是要走的路。不要忘记添加对它的引用。此代码说明了使用HTML Agility Pack创建XSLT的一种方法,这是我认为您想要做的。

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(@"<html>" + 
        "<a href='#compantnameURL1#'>#companyname1#</a>" +
        "<a href='#compantnameURL2#'>#companyname2#</a>" +
        "</html>");

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.IndentChars = ("    ");
    settings.Encoding = Encoding.UTF8;

    using (XmlWriter writer = XmlWriter.Create(Console.Out, settings))
    {                                
        writer.WriteStartDocument();
        writer.WriteStartElement("xsl", "stylesheet", "http://www.w3.org/1999/XSL/Transform");
        writer.WriteStartElement("template", "http://www.w3.org/1999/XSL/Transform");
        writer.WriteAttributeString("match", "/");
        writer.WriteElementString("apply-templates", "http://www.w3.org/1999/XSL/Transform", "");
        writer.WriteEndElement();
        writer.WriteStartElement("template", "http://www.w3.org/1999/XSL/Transform");
        writer.WriteAttributeString("match", "test/");
        foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a"))
        {
            HtmlAttribute att = link.Attributes["href"];
            writer.WriteStartElement("a");
                writer.WriteStartElement("attribute", "http://www.w3.org/1999/XSL/Transform");
                    writer.WriteStartElement("value-of", "http://www.w3.org/1999/XSL/Transform");
                        writer.WriteAttributeString("select", att.Value);
                    writer.WriteEndElement();
                writer.WriteEndElement();
                writer.WriteStartElement("value-of", "http://www.w3.org/1999/XSL/Transform");
                    writer.WriteAttributeString("select", link.InnerText);
                writer.WriteEndElement();
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
        writer.WriteEndDocument();

    }

答案 1 :(得分:0)

我不知道一个可以让你全部使用XSLT的组件,但是对于任何类型的HTML操作,HTML Agility Pack都是精彩的。解析器将提供一个完整的对象树,其中包含明确定义的属性,标签,样式等,并且可以使用XSLT轻松查询。

此外,有关使用正则表达式解析HTML的详细讨论,请参阅this post上的第一个答案。