XSLT: список вывода при условии атрибута parent-node - PullRequest
0 голосов
/ 22 августа 2011

Я изо всех сил пытаюсь создать список, который будет отображаться при условии родительского узла («папка») с атрибутом «свернутый», установленным в «да» или «нет». Результат должен отображать только первые два уровня списка, а не третий уровень, как показано ниже.

  • первый. Уровень: дисплей
  • второй. Уровень: дисплей
  • третий. Уровень: НЕТ дисплея

Идея состоит в том, чтобы проверить атрибут 'folder' <folder folded="yes"> с помощью <xsl:if test="not(parent::yes)">. Это должно претендовать на 3-е. Уровень НЕ отображается, но почему-то он не делает то, что я хочу. Я, вероятно, использую неправильную конструкцию и / или синтаксис. Помощь высоко ценится, спасибо.

Структура XML с некоторым содержанием:

<xbel>
    <folder folded="yes">
        <level>1</level>
        <title>bookmarks</title>
        <desc>my bookmarks</desc>
        <folder folded="no">
            <level>2</level>
            <title>Android</title>
            <desc>my Android</desc>
            <bookmark href="http://www.phonesreview.co.uk/">
                <title>HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend</title>
                <desc>The new HTC Sync 3.0.5422 update will be most welcome...</desc>
            </bookmark>
            <folder folded="no">
                <level>3</level>
                <title>Apps</title>
                <desc>Android Apps</desc>
                <bookmark href="http://www.androidzoom.com/">
                    <title>Android Communication Apps</title>
                    <desc>Download Communication Apps for Android.</desc>
                </bookmark>
                <bookmark href="http://www.htc.com/">
                    <title>HTC - Android</title>
                    <desc>Apps for HTC-Android.</desc>
                </bookmark>
            </folder>
        </folder>
    </folder>
</xbel>

XSLT:

 <!--creates a nested list of elements named 'folder'-->
<xsl:template match="folder" mode="linklist">
    <li>
        <xsl:if test="folder/level = 2">
                Level:<xsl:value-of select="level"/> / 
                Title:<xsl:value-of select="title"/> / 
                Desc:<xsl:value-of select="desc"/>
        <ul>
            <xsl:apply-templates mode="linklist" />
        </ul>
        </xsl:if>
    </li>
</xsl:template>

<xsl:template match="bookmark" mode="linklist">
    <li>  <!-- this bookmark is just another item in the list of bookmarks -->
        <!-- the title -->
            <a rel="nofollow" href="{@href}"><xsl:value-of select="title"/></a>
        <!-- the description -->
        <xsl:if test="desc">
            <span class="bookmarkDesc">
                <xsl:value-of select="desc"/>
            </span>
        </xsl:if>
    </li>
</xsl:template>

Таблица стилей HTML

<body>

<ul>
    <xsl:apply-templates mode="linklist" />
</ul>

</body>

Сгенерированный вывод (уровни: 1-3)

Level:1 / Title:bookmarks / Desc:my bookmarks
        Level:2 / Title:Android / Desc:my Android
            HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend ...
            Level:3 / Title:Apps / Desc:Android Apps
                Android Communication AppsDownload Communication Apps for Android.
                HTC - AndroidApps for HTC-Android.

Ожидаемый результат: (уровни: 1-2)

Level:1 / Title:bookmarks / Desc:my bookmarks
        Level:2 / Title:Android / Desc:my Android
            HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend ...

Я попробовал этот шаблон, но он выводит последние два узла, мне нужны два первых узла.

<xsl:template match="folder[parent::folder/@folded = 'yes']" mode="linklist">

1 Ответ

1 голос
/ 22 августа 2011

Самое простое возможное изменение, которое вы можете сделать, чтобы предотвратить обработку развернутых folder элементов, - это добавить пустой шаблон, который поглощает их (т. Е. Не выводит):

<xsl:template match="folder[@folded='no']" mode="linklist"/>

Все элементы folder неатрибут folded, равный no, будет обработан с использованием существующего шаблона;те, которые это сделают, будут захвачены этим новым.

Если вместо этого вы хотите обработать каждый folder элемент, имеющий либо собственный атрибут folded, равный yes, либо атрибут его родителя (как вобновленный пример XML), затем используйте следующий шаблон:

<xsl:template match="folder[@folded='yes' or ../@folded='yes']" mode="linklist">
    <!-- body elided -->
</xsl:template>

Возможно, вы также захотите включить пустой шаблон для скрытия всех других folder элементов:

<xsl:template match="folder" mode="linklist" />
...