XSLT:测试菜单中是否已'clicked'父项、子项或同级项



大家好:我正在尝试使用XSL在网页上创建菜单。当我点击(a)其中一个项目的父项时,我希望从菜单XML中选择菜单"项目"节点的特定子集;(b) 其中一项的直系后裔;或(c)自身或兄弟项目。我不知道该怎么做。代码片段位于http://pastie.org/2072445

哦,它必须是XSLT1.0,因为我正在使用PHP解析器。

您不能编写XSLT代码来测试是否单击了某个内容,因为XSLT代码在用户有机会单击任何内容之前就已运行完成。您需要编写XSLT代码来生成响应所单击内容的HTML/Javascript代码。解决这个问题的最好方法是编写一个HTML/Javascript页面,它可以手工完成您想要的内容;然后您就知道XSLT转换的输出需要是什么。如果您知道自己想要的输出是什么,那么编写程序就会容易得多!

Kevin,我将在这里发布你的一些代码,这样我就不必一直切换到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提供一个节点集,该节点集由ID为1016、1017、1019、1020的四个<item>元素组成。

相关内容

  • 没有找到相关文章

最新更新