Stefan: Mehrere WML Dateien aus einer XML Quelle

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!

  1. 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

  2. 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