XSL样式表模板没有生成适当的可视元素

时间:2016-04-18 13:32:06

标签: css xml xslt

在我的浏览器中查看XML文件(congress.xml)时,election.xsl中的drawCells模板似乎没有生成正确的可视元素。应该会生成一个条形图,但它不是。

在浏览器中打开congress.xml。在文本编辑器中打开elections.xsl。

文件是......

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

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

这是一张应该发生的事情......

vw.jpg

如果你认为你可以通过查看choose.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="sum(..//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="round(100 * $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 :(得分:2)

您将drawCells的调用封装在自己的td元素中,因此嵌套td s:

<td>
    <xsl:call-template name="drawCells">...</<xsl:call-template>
</td>

而只是做

<xsl:call-template name="drawCells">...</<xsl:call-template>

至少这会修复Firefox中的输出。