Du exporterar data från MySQL, skickar iväg den, och så förvandlas den “snabba överlämningen” till tre uppföljningar om formatering, saknade fält eller “kan du skicka filen igen?” Det är inte svårt. Det är bara konstant.
Marketing ops-team känner av det när produktflöden måste se presentabla ut snabbt. Byråansvariga stöter på det när kunder vill ha “en länk, inte en bilaga”. Och om du är företagare och sköter driften själv är den här MySQL XML-automationen ytterligare en sak som stjäl fokus.
Det här flödet gör MySQL-rader till en stylad XML-fil som du kan öppna i en webbläsare, och serverar sedan stylesheeten från GitHub Gist på ett sätt som faktiskt fungerar med moderna webbläsarregler. Du ser vad det gör, vad du behöver och var det brukar gå snett.
Så fungerar den här automationen
Hela n8n-flödet, från trigger till slutlig output:
n8n Workflow Template: MySQL till GitHub Gist, delbara XML-exporter med stil
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/mysql.dark.svg' width='40' height='40' /></div><br/>Show 16 random products"]
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define file structure", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/itemLists.svg' width='40' height='40' /></div><br/>Concatenate Items"]
n4@{ icon: "mdi:cog", form: "rounded", label: "Convert to XML", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>Create HTML"]
n6@{ icon: "mdi:cog", form: "rounded", label: "Move Binary Data", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook"]
n0 --> n1
n5 --> n6
n4 --> n5
n6 --> n7
n3 --> n4
n2 --> n3
n1 --> n2
end
subgraph sg1["Flow 2"]
direction LR
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get XSLT"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook1"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Request xsl template"]
n8 --> n9
n10 --> n8
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n1 database
class n0,n7,n8,n9,n10 api
classDef customIcon fill:none,stroke:none
class n0,n1,n3,n5,n7,n8,n9,n10 customIcon
Problemet: MySQL-exporter som inte reser bra
Råexporter funkar internt. Smärtan börjar så fort filen måste lämna er bubbla. CSV:er skapar fel med inledande nollor, Excel “hjälper till” och omformaterar värden, och JSON ser ut som brus för alla som inte är tekniska. XML är ofta en bra mellanväg, men vanlig XML skapar ändå ett andra problem: människor behöver kunna läsa den. Så du gör två jobb. Först exporterar du data. Sedan gör du den till något en intressent faktiskt kan granska utan att be om en specialrapport.
Friktionen växer. Här är var det fallerar i verkligheten.
- Någon ber om “en delbar länk”, men du fortsätter ändå skicka bilagor eller zip-filer.
- Varje omskick skapar en ny version, så du tappar bort vilken fil kunden tittar på.
- Även när datan är korrekt är presentationen ful, vilket leder till onödiga feedbackrundor.
- När du försöker lägga till ett XSL-stylesheet blockerar webbläsare det om det inte serveras från samma domän, på grund av CORS-regler.
Lösningen: exportera MySQL-rader som stylad XML (med en delbar länk)
Det här n8n-flödet ger dig ett strukturerat, repeterbart sätt att publicera “granskningsklar” XML från MySQL utan att bygga om exporten varje gång. Det startar när en webhook anropas (eller när du anpassar det för att köras enligt schema), hämtar en uppsättning poster från din MySQL-tabell och mappar samt aggregerar fälten till ett strukturerat dataset. Datasetet konverteras till en XML-sträng, kapslas in med en referens till ett XSL-stylesheet och returneras som en binär XML-fil så att den laddas ner eller öppnas snyggt i en webbläsare. Parallellt hämtar en andra hjälp-webhook din XSL-mall från en GitHub Gist och serverar den från samma domän som XML-svaret, vilket undviker det klassiska problemet där webbläsaren blockerar den.
Flödet börjar med en begäran om export, genererar sedan XML från MySQL-data och avslutar med att leverera ett stylat, läsbart dokument. Hjälprouten finns av en anledning: den får din XML + XSL att bete sig som ett enda hostat “paket” ur webbläsarens perspektiv, så att stilen faktiskt laddas.
Vad du får: automation kontra resultat
| Vad det här flödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du skickar ett veckovis “slumpmässigt produkturval” till en partner för QA: 20 rader, varje fredag. Manuellt kanske du exporterar från MySQL (10 minuter), städar upp kolumnnamn (10 minuter) och sedan klistrar in i ett dokument eller mejl så att det blir läsbart (ytterligare 10 minuter). Med det här flödet anropar du webhooken, väntar kanske en minut på frågan och formateringen och skickar sedan en länk. Det är ungefär en halvtimme ner till ett par minuter, vecka efter vecka.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- MySQL-databas med källraderna som ska exporteras
- GitHub Gist för att lagra XSL-stylesheet-mallen
- GitHub-token (valfritt) (hämta den i GitHub Developer Settings)
Kunskapsnivå: Nybörjare. Du klistrar in inloggningsuppgifter, väljer fält och justerar en XSL-mall om du vill ha varumärkesprofilering.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
En webhook triggar exporten. Du (eller ett annat system) anropar den inkommande webhooken när du behöver en ny XML-fil. Många team kopplar detta till en knapp i ett internt verktyg, men det kan vara så enkelt som en sparad URL.
MySQL-poster hämtas och struktureras. Flödet hämtar poster från din MySQL-tabell och mappar sedan fälten till en förutsägbar struktur, så att exporten inte beror på stökiga kolumnnamn eller inkonsekventa datatyper.
Datan blir XML och kapslas in för styling. n8n aggregerar listan, konverterar den till XML och lägger till en referens till stylesheeten. Den här inpackningen gör att den slutliga filen öppnas i en webbläsare som en formaterad sida i stället för rå XML.
XSL-mallen serveras via en hjälp-webhook. En separat webhook hämtar XSL:en från GitHub Gist och returnerar den från samma n8n-domän, vilket gör att webbläsaren är mycket mindre benägen att blockera den.
Du kan enkelt ändra vilken MySQL-tabell du frågar mot för att stödja olika exporter utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera webhook-triggern
Det här arbetsflödet startas av två webhook-endpoints – en för XML-flödet och en för XSL-mallen.
- Öppna Inbound Webhook Trigger och ställ in Path till
81115579-ca32-496f-baa7-f14fb3baec6f. - Ställ in Response Mode till
responseNodeså att ett svar returneras av Return XML Response. - Öppna XSL Template Webhook och ställ in Path till
044ccd2d-d1a7-485b-bb22-218a6848fd1c/models.xsl. - Ställ in Response Mode till
responseNodeså att XSL-svaret returneras av Send XSL Response.
Steg 2: anslut MySQL och hämta produkter
Produktdata hämtas från MySQL och mappas till en XML-vänlig struktur.
- Öppna Retrieve Random Products och bekräfta att Operation är
executeQuery. - Ställ in Query till
SELECT * from products ORDER BY RAND() LIMIT 16;. - Uppgifter krävs: anslut era mySql-inloggningsuppgifter.
- Öppna Map Product Fields och låt Keep Only Set vara aktiverat.
- Lägg till följande fältmappningar:
- Product.Code →
{{ $json.productCode }} - Product.Name →
{{ $json.productName }} - Product.Line →
{{ $json.productLine }} - Product.Scale →
{{ $json.productScale }} - Product.Price →
{{ $json.MSRP }}
- Product.Code →
Steg 3: aggregera och konvertera till XML
Dessa noder aggregerar produkterna och genererar XML-utdata.
- Öppna Aggregate Product List och ställ in Operation till
concatenateItems. - Ställ in Aggregate till
aggregateAllItemDataoch Destination Field Name tillProducts. - Öppna Transform to XML och ställ in Mode till
jsonToxml. - Säkerställ att Options → Headless är aktiverat så att XML-headern läggs till senare.
Steg 4: bygg XML-omslaget och svara
XML:en kapslas in med en referens till stilmallen, konverteras till binärt och returneras via webhook.
- Öppna Build XML Wrapper och ställ in HTML till:
{{ $json.data }} - Öppna Convert to Binary och ställ in Mode till
jsonToBinarymed Source Key satt tillhtml. - Bekräfta att Options → MIME Type är
text/xmloch att Use Raw Data är aktiverat. - Öppna Return XML Response och säkerställ att Respond With är
binary. - Ställ in svarshuvuden i Return XML Response:
- Content-Type →
text/xml - Control-Allow-Origin →
*
- Content-Type →
Steg 5: konfigurera leverans av XSL-mallen
Den här grenen levererar XSL-stilmallen när XML:en refererar till den.
- Öppna Fetch XSL Template och ställ in URL till
https://example.com/models.xsl?key=[CONFIGURE_YOUR_API_KEY]. - Säkerställ att svarsformatet är satt till fil (Options → Response → Response Format =
file). - Öppna Send XSL Response och ställ in Respond With till
binary. - Bekräfta att svarshuvudet Content-Type är
text/xsl.
[CONFIGURE_YOUR_API_KEY] i Fetch XSL Template med er riktiga nyckel, annars kommer endpointen för stilmallen att fallera.Steg 6: testa och aktivera ert arbetsflöde
Verifiera att båda webhook-endpoints returnerar korrekt XML- och XSL-innehåll innan ni går live.
- Klicka på Execute Workflow och skicka en testförfrågan till Inbound Webhook Trigger-URL:en.
- Bekräfta att svaret returnerar XML-innehåll med referensen till stilmallen och produktdata.
- Skicka en förfrågan till XSL Template Webhook-URL:en och verifiera att XSL-filen returneras.
- När allt ser korrekt ut, växla arbetsflödet till Active för användning i produktion.
Vanliga fallgropar
- MySQL-inloggningsuppgifter kan gå ut eller kräva specifika behörigheter. Om något slutar fungera, kontrollera först din credential-post i n8n och databasanvändarens SELECT-rättigheter.
- Om du serverar XML:en till en webbläsare och testar snabbt kan cache få dig att tro att exporten inte ändrades. Gör en hård uppdatering eller lägg till en enkel cache-busting query string medan du validerar.
- Åtkomst till GitHub Gist kan fallera på grund av rate limits eller saknad token för privata gists. Titta på HTTP Request-nodens response body i n8n:s körloggar innan du rör något annat.
Vanliga frågor
Cirka 30 minuter om din MySQL- och GitHub-åtkomst är redo.
Nej. Du kopplar in inloggningsuppgifter och justerar några mappade fält. Att redigera XSL:en är valfritt, men det är bara malltext om du vill varumärkesprofilera outputen.
Ja. n8n har ett gratis alternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in GitHub API-användning, som vanligtvis är försumbar för en enda gist.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärd och hanterar n8n bra. Egen hosting ger dig obegränsat antal körningar men kräver grundläggande serveradministration.
Ja. Du justerar främst MySQL-frågan i “Retrieve Random Products” och fältmappningen i “Map Product Fields”, och uppdaterar sedan XML-strukturen som skapas i steget “Transform to XML”. Vanliga justeringar är att byta taggnamn för att matcha en partners specifikation, filtrera på kategori eller uppdateringsdatum och lägga till beräknade fält som formaterade priser.
Oftast är det ett auth-problem eller en rate limit. Om gisten är privat behöver du en GitHub-token med rättighet att läsa den, och den token måste läggas till i HTTP Request-nodens headers. Om den är publik beror fel ofta på fel raw-URL, ett tillfälligt GitHub-avbrott eller att din server blockerar utgående anrop. Kontrollera HTTP-statuskoden och response body i n8n:s körlogg; den säger tydligt vad som är fel.
Några tusen rader per körning är realistiskt i de flesta upplägg, och fler om din server har tillräckligt med minne.
Ofta, ja, eftersom det här flödet gör fil-liknande output plus en hjälp-endpoint för XSL, och det blir klumpigt i de flesta “tvåstegs”-automationverktyg. n8n är bekvämt med webhooks, binära filer och egna responses, så du kan servera XML:en och stylesheeten på ett kontrollerat sätt. Egen hosting spelar också roll om du kör exporter ofta, eftersom du inte betalar per task på samma sätt. Zapier eller Make kan fortfarande fungera om du bara behöver skicka rader någonstans, men att servera en stylad XML-vy är den del som oftast blir rörig. Vill du ha hjälp att välja, prata med en automationsexpert.
När det här väl rullar blir “skicka exporten” en länk du kan återanvända, inte en uppgift du upprepar. Ärligt talat är en friktionsfri överlämning hela poängen.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.