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 を構築していますが、アイテムの 2 番目のレベルでのみです (これは、2 番目のナビゲーション アイテムのみを含むページの左側にある 2 番目のナビゲーション バー用です)。これは最大で 2 層の深さであったため、2 番目のレベルの ItemSelected ノードを簡単にチェックするだけで、そのノードの "current" などの LI 要素にクラスを追加して、ナビゲーション。

次に、上記のように 3 番目のレイヤーを追加します。ここでの秘訣は、3 番目のレイヤーは実際には順序付けられていないリストに表示されず、2 番目のレイヤーのアイテムのみが表示されるため、2 番目のレイヤーのアイテムは、「ItemSelected」ノードであっても「現在」のクラスを取得する必要があることです。その子の 1 つです。

以前は次のチェックを行っていました。

<xsl:variable name="SelectedMenu" select="ItemSelected/text()" />
<xsl:if test="contains('true', $SelectedMenu)">...</xsl:if>

そして、それが true に等しいかどうかを確認して、クラスを追加します。しかし、現在のアイテムだけでなく、すべてのサブアイテムも見て、それらのいずれかに「true」があるかどうかを確認する必要があります。

誰かがそれを行うために何をする必要があるかを理解するのを手伝ってもらえますか? XSLT のニュアンスや、このようなことを行う方法を覚えていません...

4

2 に答える 2

1

しかし、現在のアイテムだけでなく、すべてのサブアイテムも見て、それらのいずれかに「true」があるかどうかを確認する必要があります。

使用:

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

Itemname_ secondlayeritem_ ItemSelected_ true_

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

この式を使用して、そのような要素の存在をテストします。これは、アイテムを出力に含める必要があることを示します。

于 2012-07-09T21:18:50.413 に答える