XSLT条件节点选择

时间:2009-10-13 12:58:41

标签: xslt recursion menu

这是我的问题。我有一个像这样组织的“菜单”:

<menutree>
  <menuitem name="Foo">
    <menuitem name="Sub-Foo">
      <menuitem name="Sub-sub-foo1"/>
      <menuitem name="Sub-sub-foo2"/>
      <menuitem name="Sub-sub-foo3"/>
    </menuitem>
    <menuitem name="Other-Sub-Foo">
      <menuitem name="Other-Sub-sub-foo1"/>
      <menuitem name="Other-Sub-sub-foo2"/>
      <menuitem name="Other-Sub-sub-foo3"/>
    </menuitem>
  </menuitem>
  <menuitem name="Bar">
    <menuitem name="Sub-Bar">
      <menuitem name="Sub-sub-Bar1"/>
      <menuitem name="Sub-sub-Bar2"/>
      <menuitem name="Sub-sub-Bar3"/>
    </menuitem>
  </menuitem>
</menutree>

我正在寻找类似以下的结果,假设您在 Sub-sub-foo1 页面中。 如果我在Sub-Foo页面中,这也是我寻找的输出,因为我想显示我当前分支的哪些子页面。 Other-Sub-Foo 会显示Other-sub-sub-foo页面。

     
  • 富  
    • 子富      
             
      • 子子foo1
      •      
      • 子子foo2的
      •      
      • 子子foo3
      •      
           
    •      
    • 其他 - 子富
    •    
     
  • 酒吧

这个想法是菜单将根据当前上下文自行构建。每个页面在树中通过“menu”属性引用,并且在我的XML中包含的每个“页面”中,我解析菜单树以基于当前上下文构建正确的菜单。

1 个答案:

答案 0 :(得分:1)

你在寻找这样的东西:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:param name="currentPage">Sub-sub-foo1</xsl:param>
  <xsl:template match="/">
    Current page: <xsl:value-of select="$currentPage" /><br />
    <ul>
      <xsl:choose>
        <xsl:when test="//menuitem[@name=$currentPage]">
          <xsl:apply-templates select="//menuitem[@name=$currentPage]/.." />
        </xsl:when>
        <xsl:otherwise>
          <xsl:apply-templates />
        </xsl:otherwise>
      </xsl:choose>
    </ul>
  </xsl:template>

  <xsl:template match="menuitem">
    <li>
      <xsl:choose>
        <xsl:when test="@name=$currentPage">
          <b><xsl:value-of select="@name" /></b>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="@name" />
        </xsl:otherwise>
      </xsl:choose>

      <xsl:if test="menuitem">
        <ul>
          <xsl:apply-templates />
        </ul>
      </xsl:if>
    </li>
  </xsl:template>

</xsl:stylesheet>