Mehrere WML Dateien aus einer XML Quelle
Stefan
- xsl
0 fjh0 Thomas J.S.
Ich habe eine XML Datei der Form:
<WURZEL>
<ELEMENT>
<NAME>Kirsche</NAME>
<DETAILS>
<FARBE>rot</FARBE>
<FORM>rund</FORM>
<GESCHMACK>sauer</GESCHMACK>
</DETAILS>
</ELEMENT>
<ELEMENT>
<NAME>Banane</NAME>
<DETAILS>
<FARBE>gelb</FARBE>
<FORM>lang</FORM>
<GESCHMACK>süß</GESCHMACK>
</DETAILS>
</ELEMENT>
</WURZEL>
die ich mit einer XSL in ein WML Datei verwandle:
<xsl:template match="WURZEL">
<xsl:processing-instruction name="cocoon-format">
type="text/wml"
</xsl:processing-instruction>
<wml>
<card id="index" title="Früchte">
<i>contents:</i><br />
<xsl:for-each select="ELEMENT">
<xsl:number value="position( )" format="1: " />
<a><xsl:attribute name="href">#card_xsl:number/</xsl:attribute>
<xsl:value-of select="NAME" /></a><br />
</xsl:for-each>
</card>
<xsl:apply-templates />
</wml>
</xsl:template>
<xsl:template match="ELEMENT">
<card title="{NAME}">
<xsl:attribute name="id">card_xsl:number/</xsl:attribute>
<i>details:</i><br />
<xsl:value-of select="DETAILS/FARBE"/><br />
<xsl:value-of select="DETAILS/FORM"/><br />
<xsl:value-of select="DETAILS/GESCHMACK"/><br />
</card>
</xsl:template>
</xsl:stylesheet>
Da sich aber alle Cards in einer Datei befinden kann es bei vielen "Früchten" schon einmal dazu kommen das der Speicher des Telefons nicht ausreicht und die Datei nicht angezeigt wird. Deshalb möchte ich für jede Frucht auch physisch eine eigene Datei mit den Details generieren die dann verlinkt, und bei Bedarf aufgerufen werden kann:
frucht_xsl:number/.wml
Ich benutze derzeit das Framwork von Apache Cocoon zum verarbeiten, bin aber nicht sehr bewandert in Java. Alleine mit XML und XSL komme ich hier nicht weiter, oder? Kennt jemand eine einfache Lösung? - Danke!
Hallo,
Deshalb möchte ich für jede Frucht auch physisch eine eigene Datei mit den Details generieren die dann verlinkt, und bei Bedarf aufgerufen werden kann:
Ich benutze derzeit das Framwork von Apache Cocoon zum verarbeiten, bin aber nicht sehr bewandert in Java. Alleine mit XML und XSL komme ich hier nicht weiter, oder? Kennt jemand eine einfache Lösung? - Danke!
Cocoon benutzt Xalan als XSLT-Prozessor und dieser bietet als eine proprietäre Erweiterung die Möglichkeit an, aus einer Quelldatei mehrere Ergebnisdateien zu erzeugen, was mit XSLT 1.0 nicht möglich ist: http://xml.apache.org/xalan/extensions.html#ex-redirect
Gruß
Franz
hallo Stefan,
solltest du mit der von Franz vorgeschlagenen lösung nicht klarkommmen, kanns du aus der selben xml datei per paramter duch die xsl datei nur den benötigten frucht aufrufen.
dazu musst du an der xml datei auch was ändern ändern:
z.B: könnte das ganz so gehen:
<ELEMENT id="blabla">
<NAME>Kirsche</NAME>
<DETAILS>
<FARBE>rot</FARBE>
<FORM>rund</FORM>
<GESCHMACK>sauer</GESCHMACK>
</DETAILS>
</ELEMENT>
der link könnte dann so aussehen:
fruechte.xml?foo=blabla
übergeben kannst du das dann so:
----------
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="foo" select="''" />
<xsl:template match="WURZEL">
<xsl:processing-instruction name="cocoon-format">
type="text/wml"</xsl:processing-instruction>
----------
der link könnte dann so erstellt werden:
<card id="index" title="Früchte">
<i>contents:</i><br />
<xsl:for-each select="ELEMENT">
<xsl:number value="position( )" format="1: " />
<a>
<xsl:attribute name="href">fruechte.xml?foo=<xsl:value-of select="@id" /></xsl:attribute>
<xsl:value-of select="NAME" /></a><br />
</xsl:for-each>
</card>
<xsl:apply-templates select="ELEMENT[@id = $foo]"/>
--------
das sollte bewirken, dass jeweils nur ein frucht dargestellt wird, egal wie groß der xml datei ist.
du kannst auch noch eine abfrage machen ob überhaupt ein frucht gefrag wurde oder nicht und dementsprechend was anderes laden:
xsl:choose
<xsl:when test="$foo">
<xsl:apply-templates select="ELEMENT[@id = $foo]"/>
</xsl:when>
xsl:otherwise
was auch immer du hier haben willst
</xsl:otherwise>
</xsl:choose>
-----
grüße
thomas