使用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文件创建html列表

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> 

你仍然可能有问题。可能有atomfeedburner这样的名称空间,或者根元素可能是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>