Umbraco: Создать RSS-ленту проблем - PullRequest
2 голосов
/ 03 января 2012

Я довольно новичок в Umbraco, но сумел сделать много крутых вещей за короткое время. Одна вещь, которую я просто не могу сделать, это RSS-лента! Кажется, это самое трудное! Я уже несколько дней пытаюсь заставить эту чертову штуку работать, но она не будет!

Хорошо, вот что я сделал,

Я зашел в XSLT Files, создал новый документ RSS Feed, затем добавил URL в раздел на сайте, то есть News, который содержит файлы новостей.

Вы можете проверить мой код внизу.

После создания этого XSLT я перехожу к типам документов, создаю новый, с новой главной страницей, добавляю макрос, а затем создаю страницу в разделе «Содержимое».

Когда я делаю это, я получаю следующую ошибку:

ОШИБКА:

Эта страница содержит следующие ошибки:

ошибка в строке 3 в столбце 6: объявление XML допускается только в начале документа

Ниже приведено отображение страницы до первой ошибки.

Кто-нибудь знает, где я иду не так? Я посмотрел на источник, и похоже, что он не перебирает файлы каталогов News.

Однако, когда я добавляю этот макрос на мою домашнюю страницу, он показывает ошибки, но когда я смотрю на источник, я вижу множество прекрасных 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 ]

5 голосов
/ 11 января 2012

По умолчанию все созданные пользователем шаблоны начинаются как мастер-страницы, которые, в свою очередь, наследуются от скрытой мастер-страницы с именем Default.master. Это означает, что все шаблоны содержат раздел <asp:Content>, и если объявление XML не помещается сразу после открывающего тега <asp:Content>, тогда в верхней части исходного кода будет пустая строка, вызывающая описанную вами ошибку.

Обычно я решаю эту проблему, помещая объявление 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> без пробелов и разрывов строк.

2 голосов
/ 07 октября 2014

Если вы используете бритву, вы можете избежать этой ошибки, заменив разрыв строки следующим образом:

@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"?>
...