XSLT: тестирование, если в меню «щелкнули» родительский, дочерний элемент или элемент брата - PullRequest
0 голосов
/ 15 июня 2011

Привет всем: я пытаюсь использовать XSL для создания меню на веб-странице.Я хочу, чтобы конкретное подмножество узлов «Item» меню выбиралось из XML-меню, когда я щелкаю по одному из (a) родительского элемента одного из этих элементов;(б) прямой потомок одного из этих предметов;или (в) предмет для себя или родного брата.Я не могу понять, как это сделать.Фрагменты кода в http://pastie.org/2072445

О, и это должен быть XSLT 1.0, поскольку я использую синтаксический анализатор PHP.

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Вы не можете написать XSLT-код, который проверяет, нажали ли что-то, потому что XSLT-код выполняется до завершения, прежде чем пользователь получит возможность щелкнуть что-либо. Вам нужно написать XSLT-код, чтобы сгенерировать код HTML / Javascript, который реагирует на нажатие. Лучший способ справиться с этим - написать страницу HTML / Javascript, которая делает то, что вы хотите, вручную; тогда вы знаете, каким должен быть результат вашего XSLT-преобразования. И гораздо проще написать программу, если вы знаете, что хотите, чтобы ее вывод был!

0 голосов
/ 16 июня 2011

Кевин, я собираюсь опубликовать здесь немного вашего кода, чтобы мне не пришлось переключаться на pastie:

<!-- XSL CODE FRAGMENT -->
<xsl:choose>
    <!-- If one of my ancestor items is the Active Item, then show myself and my siblings -->
    <xsl:when test="boolean(ancestor::item[@id = $activeItemID])">
        <xsl:apply-templates select="//submenu[@child_of = $activeItemID]"/>
    </xsl:when>
    <!-- If one of my child items is the Active Item, then show my siblings -->
    <xsl:when test="boolean(descendant::item[@id = $activeItemID])">
        <xsl:apply-templates
            select="//submenu [@child_of = number(descendant::item[@id = $activeItemID]/parent::submenu/parent::item/@child_of)]"/>
    </xsl:when>
    <xsl:otherwise>
        <!-- Either myself or one of my siblings is the active Item, so simply show myself and my siblings   -->
        <xsl:apply-templates
            select="//submenu[@child_of = number(//item[@id = $activeItemID]/@child_of)]"/>
    </xsl:otherwise>
</xsl:choose>

Поскольку вы не опубликовали ни одного из окружающих XSLT, у нас нет возможности узнать, что здесь за контекстный элемент. Например, вы перебираете все элементы элемента? Другими словами, когда в вышеприведенных комментариях говорится «элементы моего предка», «мои братья и сестры» и т. Д., Мы не знаем, какой узел является «мной».

Затем, после использования узла контекста для проверки условий, связанных с предками / потомками / братьями и сестрами узла контекста, вы применяете шаблоны к элементам подменю, которые странным образом не имеют отношения к узлу контекста.

Мне действительно трудно понять, что ты пытаешься сделать. В примере кода вы применяете шаблоны к submenu элементам; но в комментариях вы говорите, что хотите выбрать item элементов.

В своем комментарии к @Michael вы сказали: «Мне нужен xslt для возврата набора узлов, которые являются дочерними элементами подменю [@id = 1010]». Для этого код будет

<xsl:variable name="childNodes" select="//submenu[@id = 1010]/*" />

(Я предполагаю, что вы заботитесь только о дочерних элементах, а не о текстовых узлах (пробельных).) Это даст $ childNodes набор узлов, состоящий из четырех <item> элементов с идентификаторами 1016, 1017, 1019, 1020.

...