Umbraco:创建RSS Feed问题

时间:2012-01-03 15:35:03

标签: .net xml xslt rss umbraco

我对Umbraco很陌生,但在很短的时间内设法做了很多很酷的事情。我根本做不到的一件事是RSS Feed!这似乎是最困难的事情!我一直在努力让这个该死的东西工作,但它不会!

好的,这就是我所做的,

我进入XSLT Files,创建了一个新的RSS Feed文档,然后将URL添加到站点中的部分,即包含新闻文件的News。

您可以在下面查看我的代码。

创建此XSLT之后,我将进入文档类型,创建一个新文档类型,使用新的母版页,添加宏,然后在“内容”部分创建页面。

当我这样做时,我收到以下错误:

  

ERROR:

     

此页面包含以下错误:

     第6行第3行的

错误:仅在开始时允许XML声明   文件

下面是第一个错误之前的页面呈现。

有谁知道我哪里出错了?我查看了源代码,看起来它没有遍历新闻的目录文件。

然而,当我将这个宏添加到我的主页时,它显示错误,但是当查看源代码时,我可以看到一堆可爱的XML?

这里出了什么问题?

XSLT:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet

  version="1.0"

  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xmlns:rssdatehelper="urn:rssdatehelper"

  xmlns:dc="http://purl.org/dc/elements/1.1/"

  xmlns:content="http://purl.org/rss/1.0/modules/content/"

  xmlns:msxml="urn:schemas-microsoft-com:xslt" 

  xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" 

  exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets ">





  <xsl:output method="xml" omit-xml-declaration="yes"/>


  <xsl:param name="currentPage"/> 

  <!-- Update these variables to modify the feed -->

  <xsl:variable name="RSSNoItems" select="string('10')"/>

  <xsl:variable name="RSSTitle" select="string('My sample rss')"/>

    <xsl:variable name="SiteURL" select="string('http://localhost:58281/news.aspx')"/>

  <xsl:variable name="RSSDescription" select="string('Add your description here')"/>


  <!-- This gets all news and events and orders by updateDate to use for the pubDate in RSS feed -->

  <xsl:variable name="pubDate">

    <xsl:for-each select="$currentPage/* [@isDoc]">

      <xsl:sort select="@createDate" data-type="text" order="descending" />

      <xsl:if test="position() = 1">

        <xsl:value-of select="updateDate" />

      </xsl:if>

    </xsl:for-each>

  </xsl:variable> 

  <xsl:template match="/">

    <!-- change the mimetype for the current page to xml -->

    <xsl:value-of select="umbraco.library:ChangeContentType('text/xml')"/> 

    <xsl:text disable-output-escaping="yes">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</xsl:text>

    <rss version="2.0"

    xmlns:content="http://purl.org/rss/1.0/modules/content/"

    xmlns:wfw="http://wellformedweb.org/CommentAPI/"

    xmlns:dc="http://purl.org/dc/elements/1.1/"


      <channel>

        <title>

          <xsl:value-of select="$RSSTitle"/>

        </title>

        <link>

          <xsl:value-of select="$SiteURL"/>

        </link>

        <pubDate>

          <xsl:value-of select="$pubDate"/>

        </pubDate>

        <generator>umbraco</generator>

        <description>

          <xsl:value-of select="$RSSDescription"/>

        </description>

        <language>en</language> 

        <xsl:apply-templates select="$currentPage/* [@isDoc and string(umbracoNaviHide) != '1']">

          <xsl:sort select="@createDate" order="descending" />

        </xsl:apply-templates>

      </channel>

    </rss> 

  </xsl:template> 

  <xsl:template match="* [@isDoc]">

    <xsl:if test="position() &lt;= $RSSNoItems">

      <item>

        <title>

          <xsl:value-of select="@nodeName"/>

        </title>

        <link>

          <xsl:value-of select="$SiteURL"/>

          <xsl:value-of select="umbraco.library:NiceUrl(@id)"/>

        </link>

        <pubDate>

          <xsl:value-of select="umbraco.library:FormatDateTime(@createDate,'r')" />

        </pubDate>

        <guid>

          <xsl:value-of select="$SiteURL"/>

          <xsl:value-of select="umbraco.library:NiceUrl(@id)"/>

        </guid>

        <content:encoded>

          <xsl:value-of select="concat('&lt;![CDATA[ ', ./bodyText,']]&gt;')" disable-output-escaping="yes"/>

        </content:encoded>

      </item>

    </xsl:if>

  </xsl:template> 

</xsl:stylesheet>

2 个答案:

答案 0 :(得分:5)

默认情况下,所有用户创建的模板都作为母版页开始,而母版页又从名为Default.master的隐藏母版页继承。这意味着所有模板都包含<asp:Content>部分,如果在开始<asp:Content>标记之后没有立即放置XML声明,那么它会在源代码的顶部放置一个空行,从而导致错误'我描述过。

我通常通过将XML声明放在模板中来解决这个问题(参见下面的第2行并向右滚动)并离开宏来生成其余的XML内容。

<%@ Master Language="C#" MasterPageFile="~/umbraco/masterpages/default.master" AutoEventWireup="true" %>
<asp:Content ContentPlaceHolderID="ContentPlaceHolderDefault" runat="server"><?xml version="1.0" encoding="UTF-8"?>
    <umbraco:Macro Alias="MyRssFeed" runat="server" />
</asp:Content>

或者,如果您确实希望在宏中保留XML声明,只需在模板中确保<umbraco:Macro>标记紧跟<asp:Content>标记后面没有任何空格或换行符。< / p>

答案 1 :(得分:2)

如果您使用的是剃须刀,可以通过更换换行符来避免此错误:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
    Layout = null;
}<?xml version="1.0" encoding="UTF-8"?>
@{
    umbraco.library.ChangeContentType("text/xml");      
    var siteURL = "http://" +  Request.Url.Host.ToString();
    var rssPage = CurrentPage.AncestorOrSelf(1).Rss.First();
    var articles = CurrentPage.AncestorOrSelf(1).Descendants("Article").OrderBy("date desc");
}   
    <rss version="2.0">
        <channel>
            <title>@rssPage.title</title>
            @Html.Raw("<link>")@siteURL@Html.Raw("</link>")
            <description>@rssPage.description</description>
            <pubDate>@String.Format("{0:ddd, dd MMM yyyy HH:mm:ss}", @rssPage.CreateDate)</pubDate>
            <lastBuildDate>@String.Format("{0:ddd, dd MMM yyyy HH:mm:ss}", DateTime.Now)</lastBuildDate>
            <language>en</language>
            <generator>Umbraco</generator>

            @foreach(var article in articles)
            {
                <item>
                    <title>@if(article.HasValue("title")){@article.title}else{@article.Name}</title>
                    @Html.Raw("<link>")@siteURL@article.Url@Html.Raw("</link>")
                    <description>@article.previewText</description>
                    <pubDate>@String.Format("{0:ddd, dd MMM yyyy} {1:HH:mm:ss}", @article.date, @article.CreateDate)</pubDate>
                </item>
            }
        </channel>
    </rss>

此代码片段的关键部分是这一行 - 确保它不在下面一行:

}<?xml version="1.0" encoding="UTF-8"?>