Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.

XML import till Filemaker 9

Tråden skapades och har fått 7 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2008-04-07 16:45

Hej,

jag håller på med en importrutin av XML-data till en Filemakertabell. XML-datat jag vill importera är dock uppdelad i två nivåer där jag vill slå samman datat från dessa två nivåer till fält i en gemensam tabell. Har försökt laborera med de medföljande exempel-XSLT-mallarna men utan att lyckas än så länge.

Bifogar två testfiler, en XML och en XSLT:

-Från XML-filen vill jag således få ut Date, Lat, Long, Heading till en tabell med en post för varje "Entry".

-I XSLT-filen vill således kunna styra importen på något sätt men kan inte syntaxen tillräckligt väl för att lyckas.

Några tips?

  • Medlem
  • Stockholm
  • 2008-04-07 22:24

Hej igen,

jag är på väg mot en lösning tror jag. Bara så ni inte slår knut på er själva för att lösa problemet...

Hejsan!

Såg nyss tråden så jag fixade till ditt script lite, hoppas jag förstod vad du ville ha

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

  
  <xsl:template match="/Data">
    <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"/>
      <METADATA>
        
        <xsl:for-each select="Entry[1]/*[self::Date]|Entry[1]/*[self::Path]/*">
          <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="{name()}" TYPE="TEXT"/>
        </xsl:for-each>
      </METADATA>
      <RESULTSET FOUND="{count(*)}">
        <xsl:for-each select="*">
          <ROW MODID="0" RECORDID="{count(preceding-sibling::*)}">
            <xsl:for-each select="*[self::Date]|*[self::Path]/*">
              <COL>
                <DATA>
                  <xsl:value-of select="."/>
                </DATA>
              </COL>
            </xsl:for-each>
          </ROW>
        </xsl:for-each>
      </RESULTSET>
    </FMPXMLRESULT>
  </xsl:template>
</xsl:stylesheet>

EDIT: Bör tilläggas att jag har inte den blekaste aniing om nåt relaterat till Filemaker men xml och xslt känner jag iallfall till från det dagliga arbetet

  • Medlem
  • Stockholm
  • 2008-04-07 23:26

Stort tack. Det var just lite XML och XSLT-hjälp jag ville ha! Strålande!

  • Medlem
  • Stockholm
  • 2008-04-10 21:44

Ny fråga:

I alla poster i XML-filen finns inte alltid alla fält upptagna, enligt exemplet jag bifogade ovan finns t ex inte alltid fältet "Hdg". Detta leder tyvärr med ovanstående script att de poster som saknar just Hdg får också all annan data förskjuten och importerad in i fel fält i Filemakerdatabasen (ist för att Hdg-fältet blir tomt hamnar "Lat" där etc.
Hänger ni med?

Hur kan jag lösa detta?

Om hela elementet fattas, så kan du inte använda loopen som i mitt förra exempel. Istället måste du manuellt hantera alla element du vill ha i din utfil.

T.ex.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  
  
  <xsl:template match="/Data">
    <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"/>
      <METADATA>
        
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Date" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Hdg" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Lat" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Lon" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Heading" TYPE="TEXT"/>        
      </METADATA>
      <RESULTSET FOUND="{count(*)}">
        <xsl:for-each select="*">
          <ROW MODID="0" RECORDID="{count(preceding-sibling::*)}">
            <COL><DATA><xsl:value-of select="Date"/></DATA></COL>
            <COL><DATA><xsl:value-of select="Path/Hdg"/></DATA></COL>
            <COL><DATA><xsl:value-of select="Path/Lat"/></DATA></COL>
            <COL><DATA><xsl:value-of select="Path/Lon"/></DATA></COL>
            <COL><DATA><xsl:value-of select="Path/Heading"/></DATA></COL>
          </ROW>
        </xsl:for-each>
      </RESULTSET>
    </FMPXMLRESULT>
  </xsl:template>
</xsl:stylesheet>
  • Medlem
  • Stockholm
  • 2008-04-14 17:02

Åter igen stort tack för hjälpen. Kanske ett litet steg för dig, men ett enormt steg för mig!

Ursprungligen av hekr:

Åter igen stort tack för hjälpen. Kanske ett litet steg för dig, men ett enormt steg för mig!

Varsågod

Det är trevligt när någon uppskattar ens hjälp. Jag vet ju själv att XSL inte är det enklaste att läsa i början men när man kommer in i det är det rätt simpelt. (tills man märker dess begränsningar och hur avancerat en simpel sak kan bli när rätt funktion inte finns i xslt)

1
Bevaka tråden