我正在尝试使用C#将html页面更改为xslt页面, 例如,如果我有类似
的东西<a href="#compantnameURL#">#companyname#</a>
我必须将其转换为
<a href="{test/companynameURL}"><xsl:value-of select="test/companyname" /></a>
我有一个xsl文件,其中包含所有这些值。我不想替换这里的值,因为在替换原始值之前需要进一步处理它们。 我在这里遇到的问题是,如果值在标签的属性级别或标签的值级别中,我很难识别(替换xml构造)。
我正在尝试使用正则表达式。有人可以帮忙??
答案 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上的第一个答案。