如何在xslt中实现while循环

时间:2017-10-08 11:12:03

标签: xml xslt

我需要帮助实现xslt中的类似循环以将任何数字转换为二进制。在运行此文件时,它在浏览器上显示以下错误:

  

XSLT转换期间出错:发生了未知错误()。

只是寻找一点逻辑来指导我。

这是xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="temp.xsl"?>
<catalog>
<data>2</data>
</catalog>

下面是xslt文件,似乎调用&#34;循环&#34;功能:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0">
<xsl:template match="/">
    <xsl:call-template name ="loop" >
            <xsl:with-param name="var" select="catalog/data"/>
            <xsl:with-param name="temp" select= "$var div 2"/>
            <xsl:with-param name="data" select= "$var mod 2"/>
    </xsl:call-template>
</xsl:template>

<xsl:template name="loop">
<xsl:param name="var"></xsl:param>
<xsl:param name="temp"></xsl:param>
<xsl:param name="data"></xsl:param>
<xsl:choose>
<xsl:when test= "$temp &gt; 0">
    <xsl:value-of select="$data"/>
    <xsl:call-template name="loop">
        <xsl:with-param name="var"/>
         <xsl:with-param name="data" select="$data mod 2"/>
        <xsl:with-param name="temp" select="$temp div 2"/>
     </xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select= "$data"/> 
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

div不是整数除法 - 所以你得到无限递归。 添加楼层

另外 - 似乎我在循环中没有使用var

并且<xsl:value-of select= "$data"/>存在于两个分支中 - 因此它可以移出条件并且选择可以更改为if

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="/">
      <xsl:variable name="var"><xsl:value-of select="catalog/data" /></xsl:variable>
      <xsl:call-template name="loop">
         <xsl:with-param name="temp" select="floor($var div 2)" />
         <xsl:with-param name="data" select="$var mod 2" />
      </xsl:call-template>
   </xsl:template>
   <xsl:template name="loop">
      <xsl:param name="temp" />
      <xsl:param name="data" />
      <xsl:value-of select="$data" />
      <xsl:if test="$temp &gt; 0">
         <xsl:call-template name="loop">
            <xsl:with-param name="temp" select="floor($temp div 2)" />
            <xsl:with-param name="data" select="$data mod 2" />
         </xsl:call-template>
      </xsl:if>
   </xsl:template>
</xsl:stylesheet>