在xslt中循环两个不同的数字

时间:2014-01-03 06:18:36

标签: php xml dom xslt

我的xml中有两个节点,它们是动态生成的

  <xml>
    <start>4</start>
    <end>14</end>
  </xml>

我想在选择框中的开始到结束之间循环,我尝试了类似下面的内容但显示单个值。

 <xsl:for-each select="/doc/start[position() &lt;= /doc/end]">
  <option value=""><xsl:value-of select="position()"/></option>
 </xsl:for-each>

实际上我想要的是使用来自nodes.like

的值在选择框中生成动态选项
<select>
   <option>4</option>
  <option>5</option> --- so on till end value

</select>

我使用递归模板解决了上述问题,下面是我的解决方案

  <select class="small" name="" >
<xsl:call-template name="ascYear">
    <xsl:with-param name="count" select="/doc/start"/>
</xsl:call-template>
  </select>
  <xsl:template name="ascYear">
  <xsl:param name="count" select="1"/>
  <xsl:if test="$count &lt;= doc/end">
    <option value="{$count}"><xsl:value-of select="$count"/></option>
    <xsl:call-template name="ascYear">
      <xsl:with-param name="count" select="$count + 1"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

希望它可以帮助某人

2 个答案:

答案 0 :(得分:1)

最好使调用模板上下文独立,因此即使xml格式发生更改,也可以使用它。

<xsl:template match="/">
    <select>
        <xsl:call-template name="generate-options">
            <xsl:with-param name="current" select="xml/start"/>
            <xsl:with-param name="end" select="xml/end"/>
        </xsl:call-template>
    </select>
</xsl:template>

<xsl:template name="generate-options">
    <xsl:param name="current"/>
    <xsl:param name="end"/>

    <xsl:if test="$current &lt;= $end">
        <option><xsl:value-of select="$current"/></option>
        <xsl:call-template name="generate-options">
            <xsl:with-param name="current" select="$current + 1"/>
            <xsl:with-param name="end" select="$end"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

工作示例:http://xsltransform.net/b4GWV6/1

答案 1 :(得分:0)

解决上述问题

<select class="small" name="" >
<xsl:call-template name="ascYear">
<xsl:with-param name="count" select="/doc/start"/>
</xsl:call-template>
</select>
<xsl:template name="ascYear">
<xsl:param name="count" select="1"/>
<xsl:if test="$count &lt;= doc/end">
<option value="{$count}"><xsl:value-of select="$count"/></option>
<xsl:call-template name="ascYear">
  <xsl:with-param name="count" select="$count + 1"/>
</xsl:call-template>

如果某人有更好更有效的解决方案,请告诉我们。