XSLT:测试菜单中是否已“单击”父项,子项或兄弟项

时间:2011-06-15 15:41:07

标签: php xslt menu xslt-1.0 axis

大家好:我正在尝试使用XSL在网页上创建菜单。当我点击(a)其中一个项目的父项时,我想要从菜单XML中选择菜单“项目”节点的特定子集; (b)其中一项的直系后裔;或(c)自我或兄弟项目。我无法理解如何做到这一点。代码片段位于http://pastie.org/2072445

哦,它必须是XSLT 1.0,因为我正在使用PHP解析器。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

凯文,我将在这里发布你的一些代码,所以我不必继续切换到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>个元素,其中包含id 1016,1017,1019, 1020。