使用xslt从rss文件创建html列表
本文关键字:html 列表 文件创建 rss xslt 使用 | 更新日期: 2023-09-27 17:50:52
XSLT新手问题。我想使用xslt从rss文件创建一个html列表。我可以用一个rss文件和一个xslt文件做到这一点。
但是现在我尝试创建html列表,输出是空的。
这是我当前的代码:
string xmlsrc = "http://.../News.rss";
string Password = "myPass";
string UserAccount = "myAcc";
string DomainName = "myDom";
string xslsrc = "RSS91.xslt";
if (xmlsrc != "")
{
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(xmlsrc);
if (UserAccount != "")
{
wr.Credentials = new NetworkCredential(UserAccount, Password, DomainName);
}
wr.Timeout = 10000;
WebResponse resp = wr.GetResponse();
Stream stream = resp.GetResponseStream();
XmlTextReader reader = new XmlTextReader(stream);
reader.XmlResolver = null;
XmlDocument doc = new XmlDocument();
doc.Load(reader);
xmlRSS.Document = doc;
}
xmlRSS.TransformSource = xslsrc;
我XSLT <?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="html" indent="yes" encoding="iso-8859-1" />
<xsl:template match="/">
<xsl:for-each select="menus">
<ul>
<xsl:for-each select="menu">
<li>
<a href="{title}">
<xsl:value-of select="title" />
</a>
<ul>
<xsl:for-each select="submenu">
<li>
<a href="{title}">
<xsl:value-of select="title" />
</a>
</li>
</xsl:for-each>
</ul>
</li>
</xsl:for-each>
</ul>
</xsl:for-each>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XSLT似乎没有处理RSS文件的模板。
如果你有一个结构为:
的RSS文件/rss
/channel
/item
/title
/link
/channel
/item
/title
/link
您可以生成一个列表来打印到在XSLT中将menus
替换为rss
, menu
替换为channel
, submenu
替换为item
的提要链接。此外,您的href
指向文本而不是链接,因此将href="{title}"
替换为href="{link}"
。这个模板可以工作:
<xsl:template match="/">
<xsl:for-each select="rss">
<ul>
<xsl:for-each select="channel">
<li>
<a href="{link}">
<xsl:value-of select="title" />
</a>
<ul>
<xsl:for-each select="item">
<li>
<a href="{link}">
<xsl:value-of select="title" />
</a>
</li>
</xsl:for-each>
</ul>
</li>
</xsl:for-each>
</ul>
</xsl:for-each>
</xsl:template>
你仍然可能有问题。可能有atom
或feedburner
这样的名称空间,或者根元素可能是channel
而不是rss
。对于名称空间,您应该将它们添加到标题中:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:atom10="http://www.w3.org/2005/Atom"
xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"> ...
为了避免不同根元素的问题,让你的模板匹配channel
,并使用/
来构建你的HTML结构。这是一个完整的样式表。如果您在<rss>
根文件中有许多通道,它将打印它们的列表,其中包含子列表。如果您有<channel>
根目录,它也可以工作,打印唯一的列表项,并在子列表中打印它的rss项。
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:atom10="http://www.w3.org/2005/Atom"
xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
<xsl:output method="html" indent="yes" encoding="iso-8859-1" />
<xsl:template match="channel">
<li>
<a href="{link}">
<xsl:value-of select="title" />
</a>
<ul>
<xsl:for-each select="item">
<li>
<a href="{link}">
<xsl:value-of select="title" />
</a>
</li>
</xsl:for-each>
</ul>
</li>
</xsl:template>
<xsl:template match="/">
<html>
<head>
<title>RSS feeds</title>
</head>
<body>
<ul>
<xsl:apply-templates select="//channel"/>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>