XML сортировать и считать не работает правильно - PullRequest
0 голосов
/ 28 февраля 2012

Кажется, у меня проблема с файлом xml или xsl. Вот что должно произойти Файл XMl содержит голоса, когда он отображается, он должен сортировать и упорядочивать результаты по рангу # голосов и процентам и отображать результаты. Все выглядит правильно, за исключением того, что процент голосов далеко. Что я делаю не так?

код XMl

<?xml-stylesheet type="text/xsl" href="os.xsl" ?> 

<poll>
<ballot id="b1">

   <os>Windows Server 2003 Standard</os>
   <os>Suse Linux</os>
</ballot>
<ballot id="b2">
     <os>Windows Server 2003 Standard</os>
       <os>Ubuntu Linux</os>
       </ballot>
<ballot id="b3">

</ballot>
<ballot id="b4">
    <os>Windows Server 2003 Standard</os>
    <os>Debin Linux</os>
</ballot>
<ballot id="b5">
   <os>Suse Linux</os>
   <os>Windows Server 2003 Standard</os>
   <os>Debin Linux</os>
</ballot>
<ballot id="b6">
   <os>Suse Linux</os>
   <os>Ubuntu Linux</os>
   <os>Windows Server 2008 Standard</os>
   <os>Debin Linux</os>
</ballot>
<ballot id="b7">
   <os>Debin Linux</os>
   <os>Ubuntu Linux</os>
      <os>Debin Linux</os>
</ballot>
<ballot id="b8">
   <os>Windows Server 2008 Standard</os>
   <os>Debin Linux</os>
    <os>Ubuntu Linux</os>
    <os>Suse Linux</os>
     <os>Debin Linux</os>
    </ballot>
</poll>

XSL код начинается ниже

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--

-->


        <xsl:key name="oss" match="os" use="."/> 

    <xsl:variable name="single-os" select="//os[generate-id(.) = generate-id(key('oss', .))]/."/>
        <xsl:template match="/">
    <html>
    <head>
        <title>Top Customer Server OS</title>
        <link href="os.css" rel="stylesheet" type="text/css" /> 
    </head>
    <body>
        <h2>Top Customer Server OS </h2>
        <table border="0" width="550">
        <tr><td colspan="4">Number of the Ballots: <xsl:value-of select="count(poll/ballot)"/></td></tr>

        <tr>
        <th>Rank</th>
        <th>os</th>
        <th>Votes</th>
        <th>%</th>
        </tr>


    <xsl:for-each select="$single-os">

    <xsl:sort select="count(key('oss', current()))" order="descending" data-type="number" />
        <xsl:variable select="count(key('oss', current()))" name="votes" />
        <tr>
        <td><xsl:value-of select="position()" />.</td>
        <td>
        <xsl:value-of select="." /> 
        </td>
        <td align="right"><xsl:value-of select="$votes" /></td>
        <td align="right"><xsl:value-of select="format-number($votes div count(//ballot), '#.00%')" /></td>
        </tr>
        <xsl:if test="position() mod 10 = 0">
        <tr>
        <td colspan="4"><hr /></td>
        </tr>
    </xsl:if>
    </xsl:for-each>

    </table>
    </body>
    </html>
        </xsl:template>
        </xsl:stylesheet>

1 Ответ

1 голос
/ 28 февраля 2012

Когда вы делаете процент, вы набираете количество голосов за os на общее количество бюллетеней элементов:

<xsl:value-of select="format-number($votes div count(//ballot), '#.00%')" />

Чтовы должны делать это делить количество голосов за os на общее количество голосов за все os элементов

<xsl:value-of select="format-number($votes div count(//os), '#.00%')"/>

Это должно дать вам результаттебе нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...