UmbracoのXSLTマクロを使用してXMLフィードを読み込み、コンテンツをうまく表示するようにしています。私のマクロはフィードが利用可能なときにうまく動作しますが、フィードが404を返すと、XSLTが正常に処理できるように管理できません。Umbraco XSLTマクロで不足しているXMLフィードを適切に処理します
umbraco.library:GetXmlDocumentByUrl()を使用してXMLを取得しています。 解析エラーが発生していることがわかりました。指定したエラーテキストを返す代わりにサイトがクラッシュすることがあります。
また、私は、エラーを少し良く処理するために使用できるかどうかを確認するために、document()テストでGetXmlDocumentByUrl()をラップしようとしました。私はこれがサイトがクラッシュするのを止め、XMLフィードが存在する場合は機能しますが、エラー・テキストを表示するのではなく解析エラーを作成することが判明しました。
私は私のコードは以下の通りです、この上の任意のヘルプやアドバイスをいただければと思います:
<xsl:variable name="feed" select="'http://url.to.feed'"/>
<xsl:template match="/">
<xsl:value-of select="document($feed)"/>
<!-- start writing XSLT -->
<xsl:choose>
<xsl:when test="string-length($feed) > 0 and $feed != ''">
<xsl:choose>
<xsl:when test="document($feed)">
File found
<xsl:variable name="feedContent" select="umbraco.library:GetXmlDocumentByUrl($feed, $cacheRate)"/>
<xsl:choose>
<xsl:when test="count($feedContent/error) > 0">
<!--<xsl:when test="$feedContent != 'error'">-->
<p class="feedList">
<strong>This dynamic content is currently not available</strong><br />
The content could not be loaded. Please verify that you are on the correct page and that you have an
active internet connection.
</p>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="renderFeed">
<xsl:with-param name="feedContent" select="$feedContent"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
Can't find the file...
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<p class="feedList">
<strong>No content exists for this page</strong><br />
Please view another page.
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
アップデート:私は次のように問題を単純化するために私のコードをダウンスキミング試してみた は、これをすることになっています私はそれが私たstatmentsを選択していないことを確認するためにすぐに値を私はそこに問題がないことを保証し、また、出力となるようGetXmlDocumentByUrlの非キャッシュ実装を使用します。
<xsl:template match="/">
<!-- start writing XSLT -->
<xsl:choose>
<xsl:when test="string-length($feed) > 0 and $feed != ''">
<xsl:variable name="vDoc" select="umbraco.library:GetXmlDocumentByUrl($feed)"/>
<xsl:value-of select="$vDoc"/>
<xsl:choose>
<xsl:when test="$vDoc">
File found
</xsl:when>
<xsl:otherwise>
Can't find the file...
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<p class="feedList">
<strong>No content exists for this page</strong><br />
Please view another page.
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
明確404ページで、それは"System.Net"の文字列を返します。 WebException:リモートサーバーがエラーを返しました:(404)が見つかりません。 "System.Net.HttpWebRequest.GetResponse()at umbraco.library.GetXmlDocumentByUrl(String Url)"しかし、実際にタイムアウトに問題が発生しているフィードでは、私はfiddlerでダブルチェックして、ページが実際には200を返すではなく、XML文書が、私は次のように私のrenderFeedテンプレートであることを言及する必要がありますので、私はまだそれがむしろタイムアウト以外の方法でコンテンツを表示するために期待しているだろう。
<xsl:template name="renderFeed">
<xsl:param name="feedContent" />
<xsl:choose>
<xsl:when test="count($feedContent//item) > 0">
//Render Feed content
</xsl:when>
<xsl:otherwise>
<p class="feedList">
<strong>No content exists for this page</strong><br />
Please view another page.
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
私は時にテストを得ましたたとえば、これをテストするより良い方法がありますか?
404エラーが返されたときにGetXmlDocumentByUrl()によって返されたXMLサンプルを提供してください。 XPATH式(count($ feedContent/error)> 0)が誤って出力されている可能性があります。 – user47900