应该有一个相当简单的解决方案,但我无法让它发挥作用。
这是我的代码:
<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。
答案 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()
函数,您将获得满足条件的此序列的最后一项。