代码之家  ›  专栏  ›  技术社区  ›  Robert Claypool

xsl:for-each循环计数器

  •  10
  • Robert Claypool  · 技术社区  · 16 年前

    如何保存xsl:for-each中发生的迭代?(XSL中的变量是不可变的)

    我的目标是找到特定级别上任何节点的最大子节点数。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="testing.xsl"?>
    <Survey>
      <Question>
        <Response text="Website" />
        <Response text="Print Ad" />
      </Question>
      <Question>
        <Response text="Yes" />
      </Question>
    </Survey>
    
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
      <html>
      <head>
      </head>
      <body>
        <xsl:for-each select="Survey">
          The survey has <xsl:value-of select="count(child::Question)"/> questions.  
          <br />
          <xsl:variable name="counter">0</xsl:variable>
          <xsl:for-each select="Question">
            <!-- TODO: increment the counter ??????? -->
          </xsl:for-each>
          No more than <xsl:value-of select="$counter"/> responses were returned for any question.
        </xsl:for-each>
      </body>
      </html>
    </xsl:template>
    </xsl:stylesheet>
    
    1 回复  |  直到 14 年前
        1
  •  10
  •   Dimitre Novatchev    9 年前

    我们不会“保存xsl:for-each中发生的迭代”,因为 XSLT is a functional language 变量是不可变的。

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
    
        <xsl:template match="/">
          <xsl:call-template name="maximum">
            <xsl:with-param name="pNodes" select="*/Question"/>
          </xsl:call-template>
        </xsl:template>
    
        <xsl:template name="maximum">
          <xsl:param name="pNodes"/>
    
          <xsl:variable name="vNumNodes" select="count($pNodes)"/>
    
          <xsl:choose>
            <xsl:when test="$vNumNodes = 1">
              <xsl:value-of select="count($pNodes[1]/Response)"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:variable name="vHalf" 
                   select="floor($vNumNodes div 2)"/>
    
              <xsl:variable name="vMax1">
               <xsl:call-template name="maximum">
                <xsl:with-param name="pNodes"
                     select="$pNodes[not(position() > $vHalf)]"/>
               </xsl:call-template>
              </xsl:variable>
    
              <xsl:variable name="vMax2">
               <xsl:call-template name="maximum">
                <xsl:with-param name="pNodes"
                     select="$pNodes[position() > $vHalf]"/>
               </xsl:call-template>
              </xsl:variable>
    
              <xsl:value-of select=
               "$vMax1*($vMax1 >= $vMax2) + $vMax2*($vMax2 > $vMax1)"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:template>
    </xsl:stylesheet>
    

    应用于提供的XML文档时:

    <Survey>
        <Question>
            <Response text="Website" />
            <Response text="Print Ad" />
        </Question>
        <Question>
            <Response text="Yes" />
        </Question>
    </Survey>
    

    产生了想要的结果:

    2.

    名为 maximum 和工具 这个 DVC (Divide and Conquer principle) . 将节点列表拆分为两个,计算两个列表的最大值(递归),并返回两个列表中较大的一个。