我在五年内没有接触过XSLT,我不记得是怎么做到这一点的。基本上,我有一个XML结构,如下所示:
<xml>
<MenuDataResult>
<Item name="firstlayeritem">
<Item></Item>
<Item></Item>
<Item name="secondlayeritem">
<Item name="thirdlayeritem">
<ItemSelected>true</ItemSelected>
</Item>
</Item>
<Item></Item>
<Item></Item>
</Item>
</MenuDataResult>
</xml>
此XSLT正在构建此结构的UL,但仅限于第二级Items(这是针对仅包含二阶导航项的页面左侧的辅助导航栏)。这曾经是最多两层深,所以在第二级中对ItemSelected节点的简单检查将允许我们向该节点的“当前”或类似的LI元素添加一个类,以启用该元素的CSS突出显示。导航
现在他们想要添加第三层,如上所述。这里的技巧是,第三层实际上没有显示在无序列表中,只有第二层项目,所以第二层项目需要是获得“当前”类的那个,即使“ItemSelected”节点是其中一个孩子。
我们曾经做过这个检查:
<xsl:variable name="SelectedMenu" select="ItemSelected/text()" />
<xsl:if test="contains('true', $SelectedMenu)">...</xsl:if>
然后检查是否等于true以添加该类。但现在我需要它不仅要查看当前项目,还要查看所有子项目,以查看它们中是否有任何“真实”。
有人可以帮我弄明白需要做些什么吗?我不记得XSLT的任何细微差别或如何做这类事情......
答案 0 :(得分:1)
但现在我需要它不只是看当前的项目,而是根本不是 子项以及它们中是否有任何“真”在其中。
使用强>:
.//*[. = 'true']
答案 1 :(得分:0)
选择任何Item
属性name
,其值为secondlayeritem
并且具有名为ItemSelected
的后代元素(在任何级别),其字符串值为{{ 1}}:
true
使用此表达式测试是否存在此类元素,表示该项应包含在输出中。