祖先或自我不会选择自我

时间:2013-08-09 21:06:22

标签: xslt macros umbraco

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

这是我的代码:

<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为null,我想从<site id="1000">获取image.jpg。

如果我在<textPage id="1001">上,其中backgroundImage不为null,我想获得image2.jpg。

2 个答案:

答案 0 :(得分:4)

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

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

由于谓词是按邻近顺序应用的,所以只需使用:

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

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

[last()]在Frank的解决方案中起作用的原因是括号以文档顺序返回所包含的节点,因此最接近的节点将是最后一个。

但从语义学的角度来看,我认为简单地解决接近顺序中的第一个问题会更好。

答案 1 :(得分:0)

尝试

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

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