1

我不知道如何测试我的 umbraco 站点中的非强制性属性是否为空,并且当前如果该属性为空,我的页面会导致 XSLT 解析错误。我当前的代码很简单:

<xsl:variable name="media" select="umbraco.library:GetMedia(sectionImage, 0)" />
<xsl:if test="$media"> <!-- or $media != null -->
    <xsl:variable name="url" select="$media/umbracoFile" />
    <xsl:element name="img">
        <xsl:attribute name="src"><xsl:value-of select="$url" />
        </xsl:attribute>
    </xsl:element>
</xsl:if>

我正在运行 Umbraco v6.0.6,并且我使用了 umbraco wiki 上提供的错误检查解决方案,网址为http://our.umbraco.org/wiki/reference/umbracolibrary/getmedia

当我在 C# 中尝试类似的样式逻辑时,我发现测试变量 $media 将具有诸如“umbraco.presentation.nodeFactory.Property”之类的值。此填充内容会错误地绕过 if 测试,然后导致崩溃。

这发生在各种数据类型上;媒体文件、文本字符串、整数等。

感谢您花时间阅读我的帖子。

4

2 回答 2

1

umbraco.library:GetMedia 不能返回 null,如果没有匹配的媒体,你可能会得到一个错误,例如

<error>No media is maching '123123'</error>

问题是您的代码可以正常工作,但您没有按照应有的方式关闭 <xsl:attribute name="src">

<xsl:attribute name="src">
  <xsl:value-of select="$url" />
</xsl:attribute>

如果您出于某种原因真的想确保其中有图像,则应在 nodeTypeAlias 中编写“测试”并计算值

<xsl:variable name="media" select="umbraco.library:GetMedia(sectionImage, 0)" />
<xsl:if test="count($media[@nodeTypeAlias='Image']) > 0">
  <xsl:variable name="url" select="$media/umbracoFile" />
  <xsl:element name="img">
    <xsl:attribute name="src">
      <xsl:value-of select="$url" />
    </xsl:attribute>
  </xsl:element>
</xsl:if>

由于您使用零深度选择,xpath 变得有点“奇怪”,如果您获取具有更大深度的媒体,则必须稍微调整计数

<xsl:variable name="media" select="umbraco.library:GetMedia(sectionImage, 0)" />
<xsl:if test="count($media/*[@nodeTypeAlias='Image']) > 0">
  ...
</xsl:if>

要测试是否选择了文件夹,只需检查文件夹

<xsl:variable name="media" select="umbraco.library:GetMedia(sectionImage, 0)" />
<xsl:if test="count($media[@nodeTypeAlias='Folder']) > 0">
  ...
</xsl:if>

祝你好运

于 2013-07-08T20:42:12.303 回答
0

好的,所以初始 IF 条件必须这样做:

 <xsl:if test = "sectionImage != ''">

这就是 XSLT/Xpath 检查 XML 标记是否为空的方式。然后可以使用 Eric Herlitz 的解决方案,或者使用虚拟方法来开始分配值而无需辅助 IF 条件。

于 2013-07-11T14:44:51.697 回答