XSLT:测试是否在菜单中“单击”了父项,子项或同级项

| 大家好:我正在尝试使用XSL在网页上创建菜单。当我单击任一项的父项时,我希望从菜单XML中选择菜单\'Item \'节点的特定子集; (b)其中一项的直接后代;或(c)自我或同级物品。我不知道该怎么做。代码片段位于http://pastie.org/2072445 哦,因为我正在使用PHP解析器,所以它必须是XSLT 1.0。     
已邀请:
        您无法编写用于测试是否单击了某些内容的XSLT代码,因为XSLT代码会在用户有机会单击任何内容之前运行完毕。您需要编写XSLT代码以生成响应单击内容的HTML / Javascript代码。解决此问题的最佳方法是编写一个HTML / Javascript页面,以手工完成您想要的操作。然后您知道XSLT转换的输出是什么。如果您知道程序的输出结果,那么编写程序就容易得多!     
        凯文(Kevin),我将在此处发布一些代码,因此我不必继续切换到粘贴:
<!-- 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返回属于submenu [@id = 1010]子级的节点集”。为此,代码将是
<xsl:variable name=\"childNodes\" select=\"//submenu[@id = 1010]/*\" />
(我假设您只关心元素子元素,而不关心(空格)文本节点。)这将给$ childNodes一个节点集,该节点集由四个ID为1016、1017、1019、1020的4个元素组成。     

要回复问题请先登录注册