2006

Sep

18

Av

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

  • (will not be published)
  • 7 − = one

Läs också: