XSLT условный выбор узла - PullRequest
0 голосов
/ 13 октября 2009

Вот моя проблема. У меня "меню" организовано так:

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

  • Foo
    • Sub-Foo
      • Суб-суб-foo1
      • Суб-суб-foo2
      • Суб-суб-foo3
    • Other-Sub-Foo
Бар

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

1 Ответ

1 голос
/ 13 октября 2009

Вы ищете что-то вроде этого:

<?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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...