【问题标题】:XSLT menu generation problemXSLT 菜单生成问题
【发布时间】:2010-12-03 08:09:00
【问题描述】:

这是我用来生成菜单的模板,但它有点坏了。使用 Xalan,我得到堆大小错误,所以我的猜测是其中的某些东西被严重破坏和邪恶。

我为网站树的当前部分预设了模板,为它提供了从网站根目录开始的路径、语言、当前深度 (p-i) 和过滤器。 >

这应该做的是选择当前级别上的所有内容,然后继续下一次迭代,这应该像在再次调用时更新“nextLevel”一样简单,用于下一级菜单......

帮助?

编辑:据我所知,只要我不进行递归,它就可以工作。我得到了我的 depht 参数指定的第一个级别,仅此而已。

网站是这样组织的:

<?xml version="1.0"?>
<site xsi:noNamespaceSchemaLocation="onepagev2.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <page pagename="Alpha">
    <language langname="en" path="./en/Alpha" dephtCount="3">
      <title>Alpha Anglo</title>
      <content>Oh noes.</content>
    </language>
    <language langname="fr" path="./fr/Alpha" dephtCount="3">
      <title>Alpha Franco</title>
      <content>Oh non.</content>
    </language>
  </page>
  <page pagename="Beta">
    <language langname="en" path="./en/Beta" dephtCount="3">
      <title>Beta Anglo</title>
      <content>Content B is content B is content B!</content>
    </language>
    <language langname="fr" path="./fr/Beta" dephtCount="3">
      <title>Beta Franco</title>
      <content>Contenu B est contenu B est contenu B!</content>
    </language>
  </page>
  <page pagename="Beta2">
    <language langname="en" path="./en/Beta/Beta2" dephtCount="4">
      <title>Beta Anglo</title>
      <content>Content B is content B is content B!</content>
    </language>
    <language langname="fr" path="./fr/Beta/Beta2" dephtCount="4">
      <title>Beta Franco</title>
      <content>Contenu B est contenu B est contenu B!</content>
    </language>
  </page>
</site>

模板:

<xsl:template name="menubuildr">
  <xsl:param name="p-path"/>
  <xsl:param name="p-lang"/>
  <xsl:param name="p-i" select="2"/>
  <xsl:param name="p-filter"/>
  <xsl:param name="p-max"/>
  <xsl:if test="$p-i &lt; $p-max">
    <ul>
      <xsl:variable name="nextLevel">
        <xsl:for-each select="str:split(string($p-path),'/')">
          <xsl:if test="position()&lt;$p-i + 1">
            <xsl:value-of select="."/>
            <xsl:if test="position()&lt;($p-i)">
              <xsl:text>/</xsl:text>
            </xsl:if>
          </xsl:if>
        </xsl:for-each>
      </xsl:variable>
      <xsl:for-each 
        select="/site/page/language[
                           starts-with(@path,$p-filter) 
                       and @dephtCount = ($p-i)
                       and $p-lang = @langname]">
        <li>
          <xsl:value-of select="@path"/>
          <xsl:text>:</xsl:text>
          <xsl:value-of select="@dephtCount"/>
          <xsl:call-template name="menubuildr">
            <xsl:with-param name="p-lang" select="$p-lang" />
            <xsl:with-param name="p-filter" select="$nextLevel"/>
            <xsl:with-param name="p-i" select="$p-i + 1"/>
            <xsl:with-param name="p-path" select="$p-path"/>
            <xsl:with-param name="p-max" select="$p-max"/>
          </xsl:call-template>
        </li>
      </xsl:for-each>
    </ul>
  </xsl:if>
</xsl:template>

示例调用:

    <div class="menu">Menu  
        <xsl:call-template name="menubuildr">  
          <xsl:with-param name="p-lang" select="@langname" />  
          <xsl:with-param name="p-filter">  
            <xsl:text>./</xsl:text>  
            <xsl:value-of select="@langname"/>  
          </xsl:with-param>   
          <xsl:with-param name="p-i" select="2"/>  
          <xsl:with-param name="p-path" select="@chemin"/>  
          <xsl:with-param name="p-max" select="count(str:split(string(@chemin),'/'))"/>  
        </xsl:call-template>  
        <hr/>  
    </div>

【问题讨论】:

  • 我不明白您描述网站组织的部分。您不能只提供模板设计使用的文档中的样本吗?
  • 对模板的示例调用也会有所帮助。

标签: xslt recursion xalan


【解决方案1】:

我认为这个测试有错误&lt;xsl:if test="position()&amp;lt;$p-i + 1"&gt;

相信我,这是真的。 :)

我猜你想要这个&lt;xsl:if test="position()&amp;lt;($p-i + 1)"&gt;

【讨论】:

  • 我仍在摸索 XSLT,我发现绕着它走很复杂。我想知道为什么。
猜你喜欢
  • 1970-01-01
  • 2011-07-14
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 2012-11-18
相关资源
最近更新 更多