大家好:我正在尝试使用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>
元素组成。