Stephan Daratha: XSL vorheriges Element

Hi

Ich habe folgendes Problem.
Bei folgende XML Datei

--------------------------------------
<object>
    <objectCosts objectNumber="XXXXX" lastCreated="XXXXXXXXXXX">
 <objectCostsPart id="AAAA">
  <objectCost begin="2007-12-22" end="2007-12-29" adults="2">111</objectCost>
  <objectCost begin="2007-12-29" end="2008-01-05" adults="2">222</objectCost>
  <objectCost begin="2008-01-05" end="2008-01-12" adults="2">333</objectCost>
  <objectCost begin="2007-12-22" end="2007-12-29" adults="3">133</objectCost>
  <objectCost begin="2007-12-29" end="2008-01-05" adults="3">244</objectCost>
  <objectCost begin="2008-01-05" end="2008-01-12" adults="3">355</objectCost>
 </objectCostsPart>
 <objectCostsPart id="BBBB">
  <objectCost begin="2007-12-22" end="2007-12-29" adults="2">111</objectCost>
  <objectCost begin="2007-12-29" end="2008-01-05" adults="2">222</objectCost>
  <objectCost begin="2008-01-05" end="2008-01-12" adults="2">333</objectCost>
  <objectCost begin="2007-12-22" end="2007-12-29" adults="3">133</objectCost>
  <objectCost begin="2007-12-29" end="2008-01-05" adults="3">244</objectCost>
  <objectCost begin="2008-01-05" end="2008-01-12" adults="3">355</objectCost>
 </objectCostsPart>
   </objectCosts>
</object>
---------------------------------------------

bearbeite ich mit folgenem XSL

--------------------------------------
<xsl:for-each select="./objectCosts/objectCostsPart">
 <!-- Hier ist sonst eine Ausgabe -->
 <xsl:for-each select="./objectCost">
  <xsl:sort select="@adults"/>
  <!-- if @adults sich von @adults vom Vorgänger unterscheidet bzw. beim ersten Durchgang-->
  xsl:textspezial Ausgabe</xsl:text>
  <!-- /if -->
xsl:textGenerelle Ausgabe</xsl:text>
 </xsl:for-each>
</xsl:for-each>
-------------------------------------

Dort fehlen jetzt natürlich die meisten Ausgaben, aber worum es mir geht ist das ich eine Möglichkeit brauche, um eine Ausgabe in der inneren For-each machen zu können wenn sich adults ändert bzw. position() = 1 ist

Es soll halt immer eine Überschrift gemacht werden für welche Personenanzahl die folgenden Zeiträume Pro gelten.
Und solange wie die Personanzahl gleich bleibt soll also keine Überschrift kommen.

Ausgabe sollte also so sein.
Abteilung AAAA
Für 2 Personen
111
222
333
Für 3 Personen
133
244
355

Abteilung BBBB
Für 2 Personen
111
222
333
Für 3 Personen
133
244
355

Aber irgendwie klappt das alles nicht.

Hat da jemand eine Idee?

  1. Hallo,

    Ich habe folgendes Problem.

    Dort fehlen jetzt natürlich die meisten Ausgaben, aber worum es mir geht ist das ich eine Möglichkeit brauche, um eine Ausgabe in der inneren For-each machen zu können wenn sich adults ändert bzw. position() = 1 ist

    Es soll halt immer eine Überschrift gemacht werden für welche Personenanzahl die folgenden Zeiträume Pro gelten.
    Und solange wie die Personanzahl gleich bleibt soll also keine Überschrift kommen.

    Ausgabe sollte also so sein.

    Ah, du willst hier die Elemente gruppieren!?

    -----------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     <xsl:key name="objC" match="objectCost" use="@adults" />
     <xsl:template match="/object">
      <xsl:for-each select="objectCosts/objectCostsPart">
       <xsl:variable name="ID" select="@id" />
      Abteilung <xsl:value-of select="@id" />
       <xsl:for-each select="objectCost[generate-id(.) = generate-id(key('objC', @adults)[parent::objectCostsPart/@id = $ID][1])]">
       Für <xsl:value-of select="@adults" /> Personen
       <xsl:for-each select="key('objC', @adults)[parent::objectCostsPart/@id = $ID]">
         <xsl:value-of select="." />
        </xsl:for-each>
       </xsl:for-each>
      </xsl:for-each>
     </xsl:template>
    </xsl:stylesheet>

    ------------------------------
    Ausagabe:
    ----------------
    Abteilung AAAA
    Für 2 Personen
    111
    222
    333
    Für 3 Personen
    133
    244
    355

    Abteilung BBBB
    Für 2 Personen
    111
    222
    333
    Für 3 Personen
    133
    244
    355

    Grüße
    Thomas

  2. Hallo,

    Es soll halt immer eine Überschrift gemacht werden für welche Personenanzahl die folgenden Zeiträume Pro gelten.
    Und solange wie die Personanzahl gleich bleibt soll also keine Überschrift kommen.

    Du willst also die Objekte gruppieren. In XSLT 2.0 wurde wohl genau wegen solcher Anwendungsfälle wohl xsl:for-each-group eingeführt.

    Rein nach Lesen der Spezifikation und insbesondere der Beispiele dort, müsste das wohl so aussehen, ungetestet:

    ~~~xml <xsl:for-each select="./objectCosts/objectCostsPart">
         <h2>
             xsl:textAbteilung </xsl:text>
             <xsl:value-of select="./@id"/>
         </h2>
         <xsl:for-each-group select="./objectCost" group-by="@adults as xs:integer">
             <h3>
                 xsl:textFür </xsl:text>
                 <xsl:value-of select="current-grouping-key()">
                 xsl:text Person(en)</xsl:text> <!-- Kann man schöner machen -->
             </h3>
             <ul>
                 <xsl:for-each select="current-group()">
                     <li><xsl:value-of select="."/></li>
                 </xsl:for-each>
             </ul>
          </xsl:for-each-group>
          <hr/>
      </xsl:for-each>

      
      
    Tim