2

应该有一个相当简单的解决方案,但我无法让它工作。

这是我的代码:

<xsl:value-of select="$currentPage/ancestor-or-self::* [@isDoc and backgroundImage != '' and string(umbracoNaviHide) != '1']/backgroundImage"/>

我想要的是,如果节点有一个由属性 backgroundImage 附加到它的背景图像,那么使用该图像。如果它没有背景图像,请检查背景图像的父节点并使用它。

对我来说发生的是它总是检查父母的背景图像,即使节点本身有背景图像。

关于如何解决这个问题的任何建议?

更新

<site id="1000" ...>
    <backgroundImage>/media/image.jpg</backgroundImage>
    <textPage id="1001" ...>
        <backgroundImage>/media/image2.jpg</backgroundImage>
    </textPage>
    <textPage id="1002" ...>
        <backgroundImage />
    </textPage>
</site>

如果我<textPage id="1002">在 backgroundImage 为空的地方,我想从中获取 image.jpg <site id="1000">

如果我<textPage id="1001">在 backgroundImage 不为空的地方,我想获得 image2.jpg。

4

2 回答 2

4

应用于 XPath 地址的数字谓词按邻近顺序处理,而来自寻址的结果节点按文档顺序交给 XSLT 处理器。

在 XSLT 1.0 中,<xsl:value-of>返回返回的第一个节点,因此是文档顺序中的第一个节点,因此如果您使用给定属性寻址所有祖先或自身,您将获得最远的节点,而不是最近的节点。在 XSLT 2.0 中,您可以获得所有这些。

由于谓词按邻近顺序应用,因此只需使用:

<xsl:value-of select="$currentPage/ancestor-or-self::*[...whatever...][1]"/>

...获得最接近“whatever”谓词所指示的属性的那些。

在 Frank 的解决方案中有效的原因[last()]是括号按文档顺序返回封闭的节点,因此其中最接近的节点将是最后一个。

但从语义的角度来看,我认为简单地按邻近顺序处理第一个更好。

于 2013-08-10T00:05:25.607 回答
0

尝试

<xsl:value-of select="($currentPage/ancestor-or-self::* [@isDoc and backgroundImage != '' and string(umbracoNaviHide) != '1'])[last()]/backgroundImage"/>

您将获得所有祖先的序列,包括使用您的代码满足条件的当前元素。如果添加last()函数,您将获得此序列中满足条件的最后一项。

于 2013-08-09T21:15:34.957 回答