XSLT样式表(可能)包含递归?

时间:2016-04-18 12:20:42

标签: xml xslt recursion

在浏览器中查看XML文件(congress.xml)时出现错误...

Error during XSLT transformation: XSLT Stylesheet (possibly) contains a recursion.

错误来自我列出的XSLT stlyesheet。问题似乎是第89行的结果。

<xsl:with-param name="cellCount" select="100 * round($candidatePercent)"/>

如果我对此进行评论,则XML文件congress.xml将至少部分显示,但包括它会导致浏览器发回错误。如果我没有弄错,drawCells模板正在尝试进行递归。在尝试查看congress.xml文件时,浏览器只是不断尝试加载页面,所以我假设它可能会陷入无限循环中?任何帮助将不胜感激。

在浏览器中打开congress.xml。在文本编辑器中打开elections.xsl并找到第89行。

文件是......

congress.xml
election.xsl
candidates.xml
vwstyles.css
vwlogo.png

这是一个google驱动器链接到所有文件... https://drive.google.com/folderview?id=0B9o30hEqwvyDc2Y3MktHNDQydnc&usp=sharing

如果您认为通过查看样式表的代码可以看到错误的来源,那么它就是......

elections.xsl - 错误所在的文件。

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:output method="html"
      doctype-system="about:legacy-compat"
      encoding="UTF-8"
      indent="yes" />


    <xsl:variable name="candidateInfo" select="document('candidates.xml')/candidates/candidate[@candidateID]" />


   <xsl:template match="/">
      <html>
         <head>
            <title>Minnesota Congressional Election Results</title>
            <link href="vwstyles.css" rel="stylesheet" type="text/css" />
         </head>

         <body>
            <div id="wrap">
               <header>
                  <img src="vwlogo.png" alt="Voter Web" />
               </header>

               <h1>Minnesota Congressional Election Results</h1>

               <section id="votingResults">
                  <xsl:apply-templates select="congressResults/district" />
               </section>

             </div>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="district">
      <h2>District <xsl:value-of select="@dNumber" /></h2>
      <table class="electionTable">
         <thead>
            <tr>
               <th>Candidate</th>
               <th>Votes</th>
            </tr>
         </thead>
         <tbody>
            <xsl:apply-templates select="candidates/candidate" />
         </tbody>
      </table>
   </xsl:template>

   <xsl:template match="candidate">
      <tr>

        <xsl:variable name="candidateVotes" select="sum(votes)" />
        <xsl:variable name="totalVotes" select="..//votes" />
        <xsl:variable name="candidatePercent" select="($candidateVotes) div ($totalVotes)" />
        <xsl:variable name="candidateName" select="$candidateInfo[@candidateID=current()/@candidateID]/name" />
        <xsl:variable name="candidateParty" select="$candidateInfo[@candidateID=current()/@candidateID]/party" />

        <th>            
            <xsl:value-of select="$candidateName" />
            (<xsl:value-of select="$candidateParty" />)         
        </th>

        <th>
            <xsl:value-of select="format-number($candidateVotes, '###,##0')" />
            (<xsl:value-of select="format-number($candidatePercent, '#0.0%')" />)
        </th>

        <td>
            <xsl:call-template name="drawCells">
                <xsl:with-param name="cellCount" select="100 * round($candidatePercent)"/>
                <xsl:with-param name="party" select="$candidateParty" />
            </xsl:call-template>
        </td>



      </tr>
   </xsl:template>

   <xsl:template name="drawCells">
      <xsl:param name="cellCount" />
      <xsl:param name="party" />
      <xsl:if test="$cellCount > 0">
         <td class="{$party}"></td>
         <xsl:call-template name="drawCells">
            <xsl:with-param name="cellCount" select="$cellCount - 1" />
            <xsl:with-param name="party" select="$party" />
         </xsl:call-template>
      </xsl:if>
   </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:3)

我认为您对totalVotes的定义不正确。

 <xsl:variable name="totalVotes" select="..//votes" />

这实际上会选择所有votes元素,但当您使用它来计算candidatePercent时,它最终会使用第一个votes元素,从而导致您的candidatePercent被大数,而不是介于0和1之间的数字。(对于第一个候选,它将是193211/263 = 764.64)。然后您将多个candidatePercent乘以100以使其更大。

尝试将其更改为

<xsl:variable name="totalVotes" select="sum(..//votes)" />

此外,我认为您可以将cellCount的设置更改为

<xsl:with-param name="cellCount" select="round(100 * $candidatePercent)"/>