Chris Neff: Gruppierung von Instrumenten nach Instrumentenart

Sali zamä

Ich kämpfe mich seit Stunden mit der Gruppier-Funktion ab, komme aber leider zu keinem Ergebnis. Hier die Situation:

XML-File >>>

<instruments>
  <zeichnung>
    <gruppe1>
      <instrument>a</instrument>
      <instrument>b</instrument>
      <instrument>c</instrument>
    </gruppe1>
    <gruppe2>
      <instrument>d</instrument>
      <instrument>e</instrument>
      <instrument>f</instrument>
    </gruppe2>
  </zeichnung>
</instruments>

Ich muss folgendes Darstellen:

gruppe1
a
b
c
gruppe2
d
e
f

Wie sieht das XSL-File (komplett) aus, mit welchem ich das bewerkstelligen kann? Bisher benutze ich das Stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/Transform" und wäre froh über eine Lösung für Version 1.0.

Besten Dank für die Hilfe

  1. Wie sieht das XSL-File (komplett) aus, mit welchem ich das bewerkstelligen kann?

    Wie sieht denn das xsl bisher aus? Nur diese eine Zeile:

    Bisher benutze ich das Stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/Transform" und wäre froh über eine Lösung für Version 1.0.

    wäre ziemlich dürftig. Schonmal bei selfHTML nachgesehen?
    http://de.selfhtml.org/xml/darstellung/index.htm

    JJ

    1. Nachfolgend das komplette XSL.
      Es zeigt zur Zeit die <instrument>s von <gruppe1> und <gruppe2> korrekt an, jedoch jeweils im Dreierpack, also:

      gruppe1
      a
      b
      c
      gruppe1
      a
      b
      c
      gruppe1
      a
      b
      c
      gruppe2
      d
      e
      f
      gruppe2
      d
      e
      f
      gruppe2
      d
      e
      f

      Ich konnte bisher den DISTINCT nicht erfolgreich einbinden.

      Hier das Matching zwischen den Begriffen:
      GRUPPE1 und GRUPPE2 entsprechen name(parent::*)
      ZEICHNUNG entspricht name(../parent::*)
      INSTRUMENT entspricht //instrument

      * * *

      <?xml version="1.0" encoding="iso-8859-1"?>

      <xsl:stylesheet version="1.0"
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              >

      <xsl:template match="/">

      <xsl:for-each select="//instrument[name(../parent::*) = 'zeichnung']">

      <xsl:sort select="name(parent::*)"/>

      <xsl:variable name="gruppe"><xsl:value-of select="name(parent::*)"/></xsl:variable>

      <tr><td colspan="100%" width="100%" align="left" valign="middle" height="25" class="normalwhite" bgcolor="#bbbbbb" style="padding:2pt;">

      <xsl:value-of select="name(parent::*)"/>

      </td></tr>
              <tr><td colspan="100%" width="100%" height="1" class="title"><img src="../img/pix_trans_1x1.gif" width="100%" height="1" border="0"/></td></tr>

      <tr height="25" class="mittelfett" align="right">
              <td width="50%" align="left" style="padding-left:2pt;">Produktname</td>
              <td width="15%">Valor</td>
              <td width="20%">ISIN</td>
              <td width="15%" style="padding-right:2pt;">Verfall</td>
              </tr>
              <tr><td colspan="100%" width="100%" height="1" class="title"><img src="../img/pix_dark_1x1.gif" width="100%" height="1" border="0"/></td></tr>

      <xsl:for-each select="//instrument[name(../parent::*) = 'zeichnung' and name(parent::*) = $gruppe]">

      <tr height="25" class="mittel" align="right" style="cursor:pointer;" OnMouseOver="className='splistrowdark'" OnMouseOut="className='splistrow'">
                      <xsl:attribute name="OnClick">javascript:parent.location.href='../products/spdetails.asp?chosen=<xsl:value-of select="instrumentVN1"/>'</xsl:attribute>
                      <td align="left" style="padding-left:2px;"><xsl:if test="descrShort[.!='']">
                              <font class="mittel"><xsl:value-of select="descrShort"/></font>
                              </xsl:if>
                              <xsl:if test="descrShort[.='']">
                                      n.a
                              </xsl:if>
                      </td><td style="padding-right:0px;"><xsl:if test="isin[.!='']">
                              <xsl:value-of select="instrumentVN1"/>
                              </xsl:if>
                              <xsl:if test="instrumentVN1[.='']">
                                      n.a
                              </xsl:if>
                      </td><td style="padding-right:0px;"><xsl:if test="isin[.!='']">
                              <xsl:value-of select="isin"/>
                              </xsl:if>
                              <xsl:if test="isin[.='']">
                                      n.a
                              </xsl:if>
                      </td><td style="padding-right:2px;"><xsl:if test="isin[.!='']">
                              <xsl:value-of select="expirationDate"/>
                              </xsl:if>
                              <xsl:if test="expirationDate[.='']">
                                      n.a
                              </xsl:if>
                      </td></tr>
                      <tr><td colspan="100%" width="100%" height="1" class="title"><img src="../img/pix_dark_1x1.gif" width="100%" height="1" border="0"/></td></tr>

      </xsl:for-each>

      <tr><td colspan="100%" width="100%" height="10" class="title"><img src="../img/pix_trans_1x1.gif" width="100%" height="10" border="0"/></td></tr>

      </xsl:for-each>

      </xsl:template>

      </xsl:stylesheet>

      1. GESCHAFFT!!!

        Hier die Lösung, basierend auf demselben XSL wie oben, einfach mit minimalen Anpassungen:

        1. Beim ersten FOR-EACH SELECT habe ich den SELECT um /parent::* erweitert, um <gruppe1>, resp. <gruppe2> zu erhalten.

        2. Der SORT und die VARIABLE-Setzung wurde angepasst: "name(.)", womit man genau den Wert erhält, der zur Zeit im ersten FOR-EACH SELECT ermittelt wird.

        Somit hat's ohne DISTINCT geklappt.

        * * *

        <?xml version="1.0" encoding="iso-8859-1"?>

        <xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                >

        <xsl:template match="/">

        <xsl:for-each select="//instrument[name(../parent::*) = 'zeichnung']/parent::*">

        <xsl:sort select="name(child::*)"/>

        <xsl:variable name="gruppe"><xsl:value-of select="name(.)"/></xsl:variable>

        <tr><td colspan="100%" width="100%" align="left" valign="middle" height="25" class="normalwhite" bgcolor="#bbbbbb" style="padding:2pt;">

        ....

        </td></tr>
                <tr><td colspan="100%" width="100%" height="1" class="title"><img src="../img/pix_trans_1x1.gif" width="100%" height="1" border="0"/></td></tr>

        <tr height="25" class="mittelfett" align="right">
                <td width="50%" align="left" style="padding-left:2pt;">Produktname</td>
                <td width="15%">Valor</td>
                <td width="20%">ISIN</td>
                <td width="15%" style="padding-right:2pt;">Verfall</td>
                </tr>
                <tr><td colspan="100%" width="100%" height="1" class="title"><img src="../img/pix_dark_1x1.gif" width="100%" height="1" border="0"/></td></tr>

        <xsl:for-each select="//instrument[name(../parent::*) = 'zeichnung' and name(parent::*) = $gruppe]">

        <tr height="25" class="mittel" align="right" style="cursor:pointer;" DEFANGED_OnMouseOver="className='splistrowdark'" DEFANGED_OnMouseOut="className='splistrow'">
                        <xsl:attribute name="DEFANGED_OnClick">javascript:parent.location.href='../products/spdetails.asp?chosen=<xsl:value-of select="instrumentVN1"/>'</xsl:attribute>
                        <td align="left" style="padding-left:2px;"><xsl:if test="descrShort[.!='']">
                                <font class="mittel"><xsl:value-of select="descrShort"/></font>
                                </xsl:if>
                                <xsl:if test="descrShort[.='']">
                                        n.a
                                </xsl:if>
                        </td><td style="padding-right:0px;"><xsl:if test="isin[.!='']">
                                <xsl:value-of select="instrumentVN1"/>
                                </xsl:if>
                                <xsl:if test="instrumentVN1[.='']">
                                        n.a
                                </xsl:if>
                        </td><td style="padding-right:0px;"><xsl:if test="isin[.!='']">
                                <xsl:value-of select="isin"/>
                                </xsl:if>
                                <xsl:if test="isin[.='']">
                                        n.a
                                </xsl:if>
                        </td><td style="padding-right:2px;"><xsl:if test="isin[.!='']">
                                <xsl:value-of select="expirationDate"/>
                                </xsl:if>
                                <xsl:if test="expirationDate[.='']">
                                        n.a
                                </xsl:if>
                        </td></tr>
                        <tr><td colspan="100%" width="100%" height="1" class="title"><img src="../img/pix_dark_1x1.gif" width="100%" height="1" border="0"/></td></tr>

        </xsl:for-each>

        <tr><td colspan="100%" width="100%" height="26" class="title"><img src="../img/pix_trans_1x1.gif" width="100%" height="26" border="0"/></td></tr>

        </xsl:for-each>

        </xsl:template>

        </xsl:stylesheet>