Hoe? Applicatie om een XML bestand om te zetten naar HTML

Ik heb een XSL stylesheet gemaakt waarmee ik een XML bestand om kan zetten in een HTML bestand. Functioneel werkt dat allemaal probleemloos, maar het gebruikersgemak laat te wensen over.

Nu moet je aan het XML bestand een regel toevoegen waarin de verwijzing staat naar de stylesheet.
Vervolgens kun je het XML bestand naar de browser slepen en je krijgt de HTML versie te zien.

Wat wil ik nu maken?

Een klein programmatje waarin je een file dialoog kunt starten om het XML bestand te selecteren.
Van het geselecteerde bestand moet vervolgens een kopie worden gemaakt naar een tijdelijke locatie.
Die kopie met gekoppeld worden aan de stylesheet en getransformeerd naar een HTML pagina.
De HTML pagina moet vervolgens worden geopend, zodat deze in de default browser verschijnt.

Op zich is dit vrij eenvoudige functionaliteit, maar ik heb even geen flauw idee hoe ik dat op de Mac het beste kan aanpakken.
Is AppleScript hiervoor een goede taal? De file dialoog en kopiëren zal daarmee prima lukken, maar hoe zit dat met het XML vertalen?

In Java kan ik een XML transformatie wel voor elkaar krijgen, maar dan zit ik weer met die file afhandeling.

Kortom: wie kan en wil mij hier op weg helpen?

Ben even aan het zien of ik op korte tijd iets kan maken voor je. Samen met Webkit moet dit makkelijk te maken zijn.

[quote:e2e5bdc9c5="masuran"]Ben even aan het zien of ik op korte tijd iets kan maken voor je. Samen met Webkit moet dit makkelijk te maken zijn.[/quote:e2e5bdc9c5] Ik ben benieuwd!

Ik ben ook benieuwd. Ik had inmiddels al de "Open Panel" sample gevonden in XCode, maar om daar op verder te borduren gaat me op dit moment nog iets te ver.

[quote:78ff516b8c="macpro"] In Java kan ik een XML transformatie wel voor elkaar krijgen, maar dan zit ik weer met die file afhandeling. [/quote:78ff516b8c] Dat kan toch prima in java en ook iets gemakkelijker dan in andere talen. Of begrijp ik het probleem niet zo goed?

Waarom zou je die file willen kopieren?.

Als het lukt om met Java een file dialoog te tonen, zodat de gebruiker de XML file kan kiezen, dan ben ik al een heel eind op weg. Maar het geheel moet dan wel als een echte Mac OS X applicatie kunnen worden samengesteld.

Ik wil de file in eerste instantie kopiëren omdat ik op dit moment in de handmatige actie de file moet aanpassen om 'm te koppelen aan de stylesheet. Als straks de transformatie plaats kan vinden zonder de oorspronkelijke file te wijzigen, dan is dat natuurlijk nog beter.

Dat kan prima hoor!. Ik heb er nu ff geen tijd voor, maar als je ff op google zoekt, kom je zeker veel bruikbare voorbeelden tegen.

Dit kun je als voorbeeld voor filedialog gebruiken en verder aanpassen tot wat je nodig hebt.

http://www.rgagnon.com/javadetails/java-0247.html

Voor het koppelen, kun je bv. het adres in de XML file zetten of een extra class maken die het adres als parameter binnen krijgt en die dan aan de parse doorgeeft.

Ik heb een avondje zitten klooien met XCode.

Het resultaat is dat ik nu een AppleScript applicatie heb waarmee ik in ieder geval al de juiste file kan selecteren.
Maar vervolgens kan ik er niets mee doen.
Via de Finder kan ik de file niet kopiëren en via TextEdit kan ik de file niet openen.
Het is telkens geen geldige file, terwijl de filenaam toch echt wel geldig is en bestaat.

Het java voorbeeld heb ik via XCode niet aan de praat gekregen, maar Apple heeft wel wat voorbeeld Java code waarin het wel werkt. Maar nadat ik daar weer wat mee had geklooid werkte het niet meer.

Ik geef op dit moment de voorkeur aan de AppleScript oplossing, omdat dat het meeste op een echte Mac applicatie lijkt.

Maar heeft iemand toevallig een voorbeeld stukje AppleScript code om één file te kopiëren?
De voorbeelden die ik tot nu heb gevonden gaan over het kopiëren van alle files in een folder, of ze zijn uit het Mac OS 9 tijdperk.

[quote:016000d0aa="macpro"]Ik heb een avondje zitten klooien met XCode.

Het resultaat is dat ik nu een AppleScript applicatie heb waarmee ik in ieder geval al de juiste file kan selecteren.
Maar vervolgens kan ik er niets mee doen.
Via de Finder kan ik de file niet kopiëren en via TextEdit kan ik de file niet openen.
Het is telkens geen geldige file, terwijl de filenaam toch echt wel geldig is en bestaat.

Het java voorbeeld heb ik via XCode niet aan de praat gekregen, maar Apple heeft wel wat voorbeeld Java code waarin het wel werkt. Maar nadat ik daar weer wat mee had geklooid werkte het niet meer.

Ik geef op dit moment de voorkeur aan de AppleScript oplossing, omdat dat het meeste op een echte Mac applicatie lijkt.

Maar heeft iemand toevallig een voorbeeld stukje AppleScript code om één file te kopiëren?
De voorbeelden die ik tot nu heb gevonden gaan over het kopiëren van alle files in een folder, of ze zijn uit het Mac OS 9 tijdperk.[/quote:016000d0aa]

Heb op dit moment een test app gegoocheld waarmee ik een file kan openen en tonen in een webkit view (safari). Als je echter on the fly een stylesheet eraan wil koppelen zal je toch de file (xml, html, enz) moeten parsen en op de juiste plaats een <link href="… moeten plaatsen.

Klinkt goed, behalve die <link href=>, want dat is voor een CSS stylesheet. Ik heb een XML file waar ik een XSL stylesheet tegenaan wil gooien.

Handmatig leg ik die koppeling door in de XML file op de 2e regel een verwijzing naar de XSL op te nemen:

[code:1:29d1e51b17]<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="stylesheet.xsl" type="text/xsl"?>[/code:1:29d1e51b17]

En als mijn geheugen me niet in de steek laat moet het mogelijk zijn om XML via XSL om te zetten zonder het oorspronkelijke XML bestand aan te passen.

[quote:fe7f0c69b6="macpro"]Klinkt goed, behalve die <link href=>, want dat is voor een CSS stylesheet. Ik heb een XML file waar ik een XSL stylesheet tegenaan wil gooien.

Handmatig leg ik die koppeling door in de XML file op de 2e regel een verwijzing naar de XSL op te nemen:

[code:1:fe7f0c69b6]<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="stylesheet.xsl" type="text/xsl"?>[/code:1:fe7f0c69b6]

En als mijn geheugen me niet in de steek laat moet het mogelijk zijn om XML via XSL om te zetten zonder het oorspronkelijke XML bestand aan te passen.[/quote:fe7f0c69b6]

Mijn XML kennis reikt niet zo ver meer maar het kan zijn dat je gelijk hebt. Als je weet op welke manier je een stylesheet kan linken zonder het bestand aan te passen laat je maar wat weten. Zal dan zien of ik dit in een cocoa app kan plaatsen.

Volgens [url=http://www.javaworld.com/javaworld/jw-09-2000/jw-0908-xpath-p2.html]dit artikel[/url] zou je het zo kunnen doen: [code:1:b6bf54405c]import org.apache.xalan.xslt.*;


XSLTProcessor processor = XSLTProcessorFactory.getProcessor();
processor.process(new XSLTInputSource(sourceDoc.getDocumentElement(),
new XSLTInputsource("http://mymachine.com/updateAddress.xsl"),
new XSLTResultTarget(newDoc.getDocumentElement());
sourceDoc = newDoc;
…[/code:1:b6bf54405c]

Het nieuwe document moet vervolgens naar de default browser worden gestuurd.

Het is gelukt!

Via AppleScript heb ik een applicatie kunnen maken waarmee ik via een open file dialoog het XML bestand kan kiezen.
Vervolgens gebruik ik de XSLT Tools Scripting Addition om de geselecteerde XML file samen te voegen met mijn XSL file.
Het resultaat sla ik op in een HTML bestand op de desktop.
En dat bestand open ik via de Finder, zodat het in de standaard browser wordt getoond.

Iedereen bedankt voor het meedenken.

Zou je de code willen delen? Ik ben benieuwd of ik ook zoiets via ObjC en Cocoa kan maken. Ik ben alleen niet zo bekend met xml en xslt, dus een werkend beginpunt is dan wel handig.

[edit]: Tijdens het googelen naar ‘xml xslt cocoa’ kom ik net deze link tegen. Scheelt me tenminste weer wat slapeloze nachten :wink:

Ik heb in XCode een AppleScript Application gemaakt. De AppleScript code is [code:1:c24185f0d7]on clicked theObject if theObject is button "browse" of window "main" then

	-- Show a file dialog to select the XML file
	tell window &quot;main&quot;
		set theFileTypes to &quot;xml&quot;
		set theDirectory to &quot;~/Documents&quot;
		set theFileName to &quot;&quot;
	end tell
	
	-- Setup the properties in the 'open panel'
	tell open panel
		set title to &quot;Select XML File&quot;
		set prompt to &quot;Select&quot;
		set treat packages as directories to false
		set can choose directories to false
		set can choose files to true
		set allows multiple selection to false
		
		-- Convert the comma separated list of file type to an actual list
		set AppleScript's text item delimiters to &quot;, &quot;
		set theFileTypes to text items of theFileTypes
		set AppleScript's text item delimiters to &quot;&quot;
	end tell
	
	-- Display the panel as sheet &#40;in which case the result will happen in 'on panel ended'&#41;.
	-- One thing to note is that the script will not stop processing until the panel is presented but continues on. You must use the 'on panel ended' event handler to get notified when the panel has finished.
	-- The 'in directory' and 'with file name' parameters are optional.
	display open panel in directory theDirectory for file types theFileTypes attached to window &quot;main&quot;
	
end if

if theObject is button &quot;show&quot; of window &quot;main&quot; then
	
	-- Get the name of the XML file as selected by the user
	set theDatabaseFile to the contents of text field &quot;DatabaseFile&quot; of window &quot;main&quot;
	try -- convert POSIX path possibly containing a ~ to an &#58; path
		set theDatabaseFile to call method &quot;stringByExpandingTildeInPath&quot; of theDatabaseFile
		set theDatabaseFile to &#40;POSIX file theDatabaseFile&#41;
	on error
		error number -43 from the theDatabaseFile
	end try
	set theXML to theDatabaseFile as string
	
	-- The XSL file has to be placed on the desktop		
	set theXSLFile to &quot;~/Desktop/convert.xsl&quot;
	try -- convert POSIX path possibly containing a ~ to an &#58; path
		set theXSLFile to call method &quot;stringByExpandingTildeInPath&quot; of theXSLFile
		set theXSLFile to &#40;POSIX file theXSLFile&#41;
	on error
		error number -43 from the theXSLFile
	end try
	set theXSL to theXSLFile as string
	
	-- The HTML file will be saved on the users desktop		
	set theHTMLFile to &quot;~/Desktop/output.html&quot;
	try -- convert POSIX path possibly containing a ~ to an &#58; path
		set theHTMLFile to call method &quot;stringByExpandingTildeInPath&quot; of theHTMLFile
		set theHTMLFile to &#40;POSIX file theHTMLFile&#41;
	on error
		error number -43 from the theHTMLFile
	end try
	set theHTML to theHTMLFile as string
	
	try
		set the outFile to transform XML file theXML using file theXSL saving as file theHTML
		
		-- Now that we have the HTML file we can open it.
		-- To use the users default browser, we're letting
		-- the Finder open the file.
		tell application &quot;Finder&quot;
			open file theHTML
		end tell
	on error
		error number -43 from the theXML
	end try
	
end if

end clicked

– This event handler is called when the panel presented with the ‘display attached to’ command is finished.

on panel ended theObject with result withResult
if withResult is 1 then
– Convert the list into a list of strings separated by return characters that we can put in the ‘path names’ text view
– For some unknown (as of yet) you must coerce the ‘path names’ to a list (even though it is defined as list).
set the pathNames to (path names of open panel as list)
set AppleScript’s text item delimiters to return
set the pathNames to pathNames as string
set AppleScript’s text item delimiters to “”

	set contents of text field &quot;DatabaseFile&quot; of window &quot;main&quot; to pathNames
	set enabled of button &quot;show&quot; of window &quot;main&quot; to true
else
	set contents of text field &quot;DatabaseFile&quot; of window &quot;main&quot; to &quot;&quot;
	set enabled of button &quot;show&quot; of window &quot;main&quot; to false
end if

end panel ended[/code:1:c24185f0d7]

Daar hoort dan nog een “NIB” bij met twee knoppen en een textfield:
Het venster heet “main”
De knop om een file te selecteren heet “browse”
De knop om de conversie te starten heet “show”
Het veld waar de naam van het geselecteerde bestand in komt heet “DatabaseFile”

Om de XSL transformatie uit te kunnen voeren heb ik gebruik gemaakt van XSLT Tools Scripting Addition.