1

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

4

2 回答 2

1

但现在我需要它不仅查看当前项目,还查看所有子项目,以查看其中是否有任何“真实”。

使用

.//*[. = 'true']
于 2012-07-10T14:32:32.223 回答
0

Select any Item that has a name attribute whose value is secondlayeritem and that has a descendant element (at any level) named ItemSelected whose string value is true:

//Item[@name='secondlayeritem'][descendant::ItemSelected[.='true']]

Use this expression to test for the presence of such an element, which indicates that the item should be included in the output.

于 2012-07-09T21:18:50.413 回答