大家好:我正在尝试使用XSL在网页上创建菜单。当我点击(a)其中一个项目的父项时,我想要从菜单XML中选择菜单“项目”节点的特定子集; (b)其中一项的直系后裔;或(c)自我或兄弟项目。我无法理解如何做到这一点。代码片段位于http://pastie.org/2072445
哦,它必须是XSLT 1.0,因为我正在使用PHP解析器。
答案 0 :(得分:1)
您无法编写XSLT代码来测试是否已单击某些内容,因为XSLT代码在用户有机会单击任何内容之前运行完成。您需要编写XSLT代码来生成响应所点击内容的HTML / Javascript代码。解决这个问题的最好方法是编写一个HTML / Javascript页面,手动完成你想要的东西;然后你知道你的XSLT转换的输出需要什么。如果你知道你希望它的输出是什么,那么编写一个程序要容易得多!
答案 1 :(得分:0)
<!-- 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。