2009-10-13 14 views
0

Вот моя проблема. У меня есть «меню» организованы следующим образом:Выбор условного узла XSLT

<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> 

И я ищу в результате, как в следующем, если вы находитесь в суб-суб-Foo1 страницы. Это также результат, который я ищу, если я нахожусь на странице Sub-Foo, так как хочу показать, какие подстраницы у меня есть для текущей ветви. Другие-Sub-Foo отображают страницы Other-sub-sub-foo.

  • Foo
    • Sub-Foo
      • суб-суб-foo1
      • суб-суб-foo2
      • суб-суб-foo3
    • Другие-Sub Foo
  • Бар

Идея состоит в том, что меню будет строить себя в зависимости от текущего контекста. Каждая страница упоминается в дереве с помощью атрибута «menu», и на каждой «странице», содержащейся в моем XML, я разбираю дерево меню, чтобы создать правильное меню на основе текущего контекста.

ответ

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> 
+0

Внутренний уль должен быть внутри литий; закрытие li должно быть помещено после закрытия xsl: if tag. –

+0

@jeff: ty, fixed –

+0

Oh. Проблема с переносом переменной в шаблон menuitem. –

Смежные вопросы