2009-10-02 65 views
0

这是我调用生成菜单的一个模板,它有点中断。使用Xalan,我得到了堆大小错误,所以我的猜测是它中的某些东西可怕地破碎和不圣洁。XSLT菜单生成问题

我预设的模板网站树的所述当前部分,喂养它从网站,语言,目前depht(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> 
+0

我不明白的地方你描述该网站的组织部分。你不能只提供模板设计用于处理的文档中的示例吗? – Welbog 2009-10-02 14:11:15

+0

立即执行此操作 – 2009-10-02 14:41:54

+0

对模板的示例呼叫也将有所帮助。 – Keith 2009-10-02 16:29:57

回答

0

我认为这是一个错误在这个测试<xsl:if test="position()&lt;$p-i + 1">

相信我,它永远是真实的。 :)

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

+0

我仍然在绕着XSLT摆弄我,我觉得把头绕在它身上很复杂。我想知道为什么。 – 2009-10-13 13:45:24