2006

Sep

18

Av Rolf

Så här i valtider presenteras mycket statistik och diagram på kors och tvärs. Om man vill göra egna sammanställningar finns alla data publicerade på internet i form av XML-filer, som ju kan importeras i FileMaker. Inte direkt, men med lite konvertering i form av en XSLT.

FileMaker kan importera XML-filer i en viss syntax, t.ex. FileMakers egen grammatik FMPXMLRESULT. XML-filer i andra format kan konverteras till denna grammatik med hjälp av en XSLT. Det är ett slags program som går genom XML-filen och omvandlar den enligt givna regler. 

XML-filerna hittar du på http://www.val.se/val/val2006/valnatt/xml/index.html och en enkel XSLT för att konvertera uppgifter om alla giltiga röster till FileMaker kan se ut så här:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://www.filemaker.com/fmpxmlresult">
  <xsl:template match="/">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="" NAME="" VERSION=""/>
            <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" 
RECORDS="{count(/*/*)}" TIMEFORMAT="h:mm:ss a"/>
            <xsl:call-template name="METADATA"/>
        </FMPXMLRESULT>
    </xsl:template>
    <xsl:template name="METADATA" match="//GILTIGA[1]">
        <METADATA>
      <FIELD>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="NAME">KOD</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
      </FIELD>
      <FIELD>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="NAME">NAMN</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
      </FIELD>
      <FIELD>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="NAME">PARTI</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
      </FIELD>
      <FIELD>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="NAME">RÖSTER</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
      </FIELD>
      <FIELD>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="NAME">RÖSTER_FGVAL</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
      </FIELD>
      <FIELD>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="NAME">PROCENT</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
      </FIELD>
      <FIELD>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="NAME">PROCENT_FGVAL</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
      </FIELD>
      <FIELD>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="NAME">PROCENT_ÄNDRING</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute>
      </FIELD>
        </METADATA>
        <xsl:call-template name="RESULTSET"/>
    </xsl:template>
  <xsl:template name="RESULTSET" match="//GILTIGA">
        <RESULTSET>
            <xsl:attribute name="FOUND">
            <xsl:value-of select="count(//GILTIGA)"/>
            </xsl:attribute>
            <xsl:for-each select="//GILTIGA">
            <ROW>
                <xsl:attribute name="MODID">0
</xsl:attribute>
                <xsl:attribute name="RECORDID">0
</xsl:attribute>
          <COL>
            <DATA>
              <xsl:value-of select="../@KOD"/>
            </DATA>
          </COL>
          <COL>
            <DATA>
              <xsl:value-of select="../@NAMN"/>
            </DATA>
          </COL>
          <xsl:for-each select="@*">
        <COL>
            <DATA>
            <xsl:value-of select="."/>
            </DATA>
        </COL>
      </xsl:for-each>
    </ROW>
            </xsl:for-each>
        </RESULTSET>
    </xsl:template>
</xsl:stylesheet>

Först definieras FileMakers datumformat mm, sedan alla fält som ska läsas och sedan allt innehåll. Endast data i taggarna GILTIGA tas med. XSLT-programmet måste alltså utökas för att inkludera all information från XML-filerna. Detta överlämnas till läsaren:)

XSLT-filen finns på adressen http://www.mallverkstan.se/valresultat.xslt.

Skapa ett nytt FileMaker-register (i version 6, 7 eller 8/8.5), importera från XML-källan (ange adress enligt ovan) med XSLT-fil enligt adress ovan.

Sen är det fritt fram att göra alla möjliga sammanställningar av data i FileMaker, om det nu är något diagram som saknas?

Skriv en kommentar

Din epost-adress stannar hos oss.