XSLT选择包含文本的所有项目

时间:2012-07-09 21:04:35

标签: xml xslt xpath

我在五年内没有接触过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的任何细微差别或如何做这类事情......

2 个答案:

答案 0 :(得分:1)

  

但现在我需要它不只是看当前的项目,而是根本不是   子项以及它们中是否有任何“真”在其中。

使用

.//*[. = 'true']

答案 1 :(得分:0)

选择任何Item属性name,其值为secondlayeritem并且具有名为ItemSelected的后代元素(在任何级别),其字符串值为{{ 1}}:

true

使用此表达式测试是否存在此类元素,表示该项应包含在输出中。