Я пытаюсь читать в XML-канале с помощью макроса XSLT в Umbraco, чтобы он отображал содержимое в хорошем формате. Мой макрос работает нормально, когда канал доступен, но если он возвращает 404, мне не удается заставить XSLT изящно с ним справиться.
Я получаю XML с помощью umbraco.library: GetXmlDocumentByUrl ()
Я обнаружил, что он создает ошибку синтаксического анализа и что иногда он просто приводит к сбою сайта, а не возвращает указанный мной текст ошибки.
Я также попытался обернуть GetXmlDocumentByUrl () в тесте document (), чтобы посмотреть, смогу ли я использовать это, чтобы немного лучше обработать ошибку. Я обнаружил, что хотя это останавливает сайт от сбоев и работает, если 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>
Обновление:
Я попытался уменьшить мой код, чтобы упростить проблему до следующего: предполагается, что он использует не-кеш-реализацию 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) Not Found. At System.Net.HttpWebRequest.GetResponse () в 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>
Я получил тесты на примере, есть ли лучший способ, которым я должен проверять это?