使用xslt从rss文件创建html列表

时间:2014-03-19 11:04:56

标签: c# xml xslt rss

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>

1 个答案:

答案 0 :(得分:3)

您拥有的XSLT似乎没有用于处理RSS文件的模板。

如果您的RSS文件具有以下结构:

/rss
   /channel
      /item
         /title
         /link
   /channel
      /item
         /title
         /link

您可以生成一个列表,打印指向您的XSLT menus替换为[{1}},rss menuchannel替换的Feed的链接{ {1}}。此外,您的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"> ... 构建HTML结构。这是一个完整的样式表。如果channel有根文件中有多个频道,它将打印一个列表,其中包含包含这些项目的子列表。如果您有一个/根,它也可以工作,打印唯一的列表项,并将其rss项目放在子列表中。

<rss>