在浏览器中查看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>
答案 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)"/>