katja: XSL und Bedingungen

Hallo zusammen,
ich moechte per xslt folgende Bedingungen auf untenstehende Baumstruktur anwenden,weiss aber nicht wie?!
Dieses sind die Bedingungen:
Wenn das Element <Assoziierter_Kunde> eine 0 enthaelt und gleichzeitig der jeweilige Kunde (wenn wir von oben anfangen
also der mit der Nr. 74614) in dem <Assoziierter_Kunde>-Element eines ANDEREN Kunden auftaucht (in untenstehendem Bsp.
also bei dem Kunden mit der Nr. 85012), moechte ich "ja" ausgeben.
Andersherum, wenn das <Assoziierter_Kunde>-Element eines Kunden 0 enthaelt, die KundenNr. dieses Kunden aber NICHT
in dem <Assoziierter_Kunde>-Element eines anderen Kunden auftaucht, bedeutet das "nein".

<Kunde>
  <Nr>74614</Nr>
  <Assoziierter_Kunde>0</Assoziierter_Kunde>
</Kunde>
<Kunde>
  <Nr>74616</Nr>
  <Assoziierter_Kunde>0</Assoziierter_Kunde>
</Kunde>
<Kunde>
  <Nr>85012</Nr>
  <Assoziierter_Kunde>74614</Assoziierter_Kunde>
</Kunde>
<Kunde>
  <Nr>92321</Nr>
  <Assoziierter_Kunde>0</Assoziierter_Kunde>
</Kunde>
<Kunde>
  <Nr>74615</Nr>
  <Assoziierter_Kunde>74616</Assoziierter_Kunde>
</Kunde>

Ich komme einfach nicht weiter - das ist alles was ich habe:

xsl:choose
 <xsl:when test="Assoziierter_Kunde[.='0'] and Assoziierter_Kunde[.=???]">
    xsl:textja</xsl:text>
  </xsl:when>
  <xsl:when test="Assoziierter_Kunde[.=???]">
    xsl:textnein</xsl:text>
  </xsl:when>
</xsl:choose>

Ich arbeite mit apply-templates.
Faellt vielleicht jemandem ein Loesungsansatz ein?
Vielen Dank im Vorraus,
Katja

  1. Hallo alle,
    ich hab's jetzt doch selber hinbekommen,
    und zwar so:
    <xsl:variable name="nr" select="NR"/>
    <xsl:variable name="var">
      xsl:choose
        <xsl:when test="..//Assoziierter_Kunde[.=$nr] or Assoziierter_Kunde[.>0]">
          xsl:textJa</xsl:text>
        </xsl:when>
        xsl:otherwise
          xsl:textNein</xsl:text>
        </xsl:otherwise>
       </xsl:choose>
    </xsl:variable>

    Jetzt weiss ich aber wirklich nicht weiter.
    Und zwar moechte ich jeweils fuer jedes "Ja" auch die entsprechende Telefonnr.
    des jeweils referenzierten Kunden ausgeben.
    D.h. wenn das Element <Assoziierter_Kunde> eine 0 enthaelt und gleichzeitig der jeweilige Kunde (wenn wir von oben anfangen
    also der mit der Nr. 74614) in dem <Assoziierter_Kunde>-Element eines ANDEREN Kunden auftaucht (in untenstehendem Bsp.
    also bei dem Kunden mit der Nr. 85012),
    moechte ich fuer Kunde 74614 die Tel.Nr. von Kunde 85012 ausgeben und umgekehrt.

    <Kunde>
      <Nr>74614</Nr>
      <Assoziierter_Kunde>0</Assoziierter_Kunde>
      <TelNr>456224744</TelNr>
    </Kunde>
    <Kunde>
      <Nr>74616</Nr>
      <Assoziierter_Kunde>0</Assoziierter_Kunde>
      <TelNr>456714744</TelNr>
    </Kunde>
    <Kunde>
      <Nr>85012</Nr>
      <Assoziierter_Kunde>74614</Assoziierter_Kunde>
      <TelNr>631232214</TelNr>
    </Kunde>
    <Kunde>
      <Nr>92321</Nr>
      <Assoziierter_Kunde>0</Assoziierter_Kunde>
    </Kunde>
    <Kunde>
      <Nr>74615</Nr>
      <Assoziierter_Kunde>74616</Assoziierter_Kunde>
    </Kunde>

    Vielen vielen Dank fuer jede Hilfe.
    Katja

    1. Hallo

      ich hab's jetzt doch selber hinbekommen,

      nur du fragst hier etwas anderes ab, als du im vorherigen posting gesagt hast.

      moechte ich fuer Kunde 74614 die Tel.Nr. von Kunde 85012 ausgeben und umgekehrt.

      "und umgekehrt" wiederspricht hier wiederum dem ansatz "wenn associerter_kunde = 0" !?!

      aber warum nicht:

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

      <xsl:template match="/root">
        <xsl:variable name="assoc" select="//Kunde/Assoziierter_Kunde" />

      <html>
        <head></head>
        <body>

      <xsl:for-each select="Kunde">
      <xsl:variable name="num" select="Nr" />
      <xsl:variable name="assocnum" select="Assoziierter_Kunde" />

      <xsl:variable name="telnum1" select="following-sibling::Kunde[Assoziierter_Kunde = $num]/TelNr | preceding-sibling::Kunde[Assoziierter_Kunde = $num]/TelNr" />
        <xsl:variable name="telnum2" select="following-sibling::Kunde[Nr = $assocnum]/TelNr | preceding-sibling::Kunde[Nr = $assocnum]/TelNr" />
        <p>
        <i><xsl:value-of select="position()" /></i>&#160;
        xsl:choose
         <xsl:when test="Assoziierter_Kunde = 0 and Nr = $assoc">
            <b>ja</b>&#160;
            xsl:choose
               <xsl:when test="$telnum1"><u>telnumm assoc.k:(<xsl:value-of select="$telnum1" />)</u>&#160;</xsl:when>
               <xsl:when test="$telnum2"><u>telnumm assoc.k:(<xsl:value-of select="$telnum2" />)</u>&#160;</xsl:when>
               xsl:otherwise</xsl:otherwise>
            </xsl:choose>
            (nummer:<xsl:value-of select="Nr" /> / assoc.kunde:<xsl:value-of select="Assoziierter_Kunde" /> / telnum:<xsl:value-of select="TelNr" />)
         </xsl:when>

      <xsl:when test="Assoziierter_Kunde = 0 and not(Nr = $assoc)">
            <b>nein</b>&#160;
            xsl:choose
               <xsl:when test="$telnum1"><u>telnumm assoc.k:(<xsl:value-of select="$telnum1" />)</u>&#160;</xsl:when>
               <xsl:when test="$telnum2"><u>telnumm assoc.k:(<xsl:value-of select="$telnum2" />)</u>&#160;</xsl:when>
               xsl:otherwise</xsl:otherwise>
            </xsl:choose>
            (nummer:<xsl:value-of select="Nr" /> / assoc.kunde:<xsl:value-of select="Assoziierter_Kunde" /> / telnum:<xsl:value-of select="TelNr" />)
         </xsl:when>

      xsl:otherwise
            trifft keines zu&#160;
            xsl:choose
               <xsl:when test="$telnum1"><u>telnumm assoc.k:(<xsl:value-of select="$telnum1" />)</u>&#160;</xsl:when>
               <xsl:when test="$telnum2"><u>telnumm assoc.k:(<xsl:value-of select="$telnum2" />)</u>&#160;</xsl:when>
               xsl:otherwise</xsl:otherwise>
            </xsl:choose>
            (nummer:<xsl:value-of select="Nr" /> / assoc.kunde:<xsl:value-of select="Assoziierter_Kunde" /> / telnum:<xsl:value-of select="TelNr" />)
         </xsl:otherwise>
        </xsl:choose>

      </p>
      </xsl:for-each>

      </body>
      </html>
        </xsl:template>
      </xsl:stylesheet>

      -----------------------

      deine xml hane ich nur so weit ergänzt:
      <?xml version="1.0"?>
      <root>
      <Kunde>
        <Nr>74614</Nr>
        <Assoziierter_Kunde>0</Assoziierter_Kunde>
        <TelNr>456224744</TelNr>
      </Kunde>

      und wo weiter mit den kunden.

      </root>

      -------

      grüße
      thomas

      1. Hallo Thomas,
        puuhh... das ist ja ein dicker Hund!
        Vielen vielen Dank,
        werde mich jetzt gleich mal ranmachen.
        Gruss, Katja

        1. Jo - es funktioniert!
          1000 Dank nochmal!
          Das haette ich alleine nicht hinbekommen.
          Gruss, Katja

          1. hallo,

            Jo - es funktioniert!

            hört man gerne. ;-)

            1000 Dank nochmal!

            ebenfalls gerne.

            Das haette ich alleine nicht hinbekommen.

            das sei dahingestellt.

            grüße
            thomas

            ps: danke für den feedback

      2. Hallo Thomas,

        aber warum nicht:

        aha, nun habe ich auch verstanden, was das Problem ausmacht und v.a. wie es zu lösen ist, also auch von meiner Seite zunächst mal Dank und gleich ein kleines "aber" ;-):

        die Variable:
        <xsl:variable name="telnum2" select="following-sibling::Kunde[Nr = $assocnum]/TelNr | preceding-sibling::Kunde[Nr = $assocnum]/TelNr" />

        ist doch eigentlich überflüssig und damit auch die Tests darauf weiter unten?

        Oder ist mir da was verborgen geblieben?

        Gruß
        Franz

        1. Hallo Franz,

          aha, nun habe ich auch verstanden, was das Problem ausmacht und v.a. wie es zu lösen ist, also auch von meiner Seite zunächst mal Dank und gleich ein kleines "aber" ;-):

          die Variable:
          <xsl:variable name="telnum2" select="following-sibling::Kunde[Nr = $assocnum]/TelNr | preceding-sibling::Kunde[Nr = $assocnum]/TelNr" />

          ist doch eigentlich überflüssig und damit auch die Tests darauf weiter unten?

          Oder ist mir da was verborgen geblieben?

          nein, nicht (ganz) überflüssig:
          katja schrieb:
          "D.h. wenn das Element <Assoziierter_Kunde> eine 0 enthaelt und gleichzeitig der jeweilige Kunde (wenn wir von oben anfangen
          also der mit der Nr. 74614) in dem <Assoziierter_Kunde>-Element eines ANDEREN Kunden auftaucht (in untenstehendem Bsp.
          also bei dem Kunden mit der Nr. 85012),
          moechte ich fuer Kunde 74614 die Tel.Nr. von Kunde 85012 ausgeben und umgekehrt."

          $telnum1 erfüllt die forderung: bei kunde-74614 wird die telfonnummer von kunde-85012 angezeigt.

          $telnum2 erfüllt eine ganz andere forderung, was katja mit einem leichten "und umgekehrt" genannt hat. also beim kunde-85012 erschient die telefonnummer von kunde-74614.

          aber diese "und umgekehrt" wiederspricht eben dem ansatz "wenn das Element <Assoziierter_Kunde> eine 0 enthaelt" denn  beim kunde-85012 ist der inhalt vom element <Assoziierter_Kunde> nicht gleich 0.
          darauf habe ich ja hingewisen und gemeint "aber warum nicht" ;-)

          überflüssig ist $telnum2 nur in den ersten 2 xsl:when (falls du diese gemeint hast, dann hast du recht.) nicht überflüssig ist $telnum2 im xsl:otherwise denn dort wird die bedingung <Assoziierter_Kunde> != 0 erfüllt.

          grüße
          thomas

          1. damit es klarar ist was ich meine,
            hier eine berenigte variante:

            grüße
            thomas
            ------------
            <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

            <xsl:template match="/root">
              <xsl:variable name="assoc" select="//Kunde/Assoziierter_Kunde" />

            <html>
              <head></head>
              <body>

            <xsl:for-each select="Kunde">
            <xsl:variable name="num" select="Nr" />
            <xsl:variable name="assocnum" select="Assoziierter_Kunde" />

            <xsl:variable name="telnum1" select="following-sibling::Kunde[Assoziierter_Kunde = $num]/TelNr | preceding-sibling::Kunde[Assoziierter_Kunde = $num]/TelNr" />
              <xsl:variable name="telnum2" select="following-sibling::Kunde[Nr = $assocnum]/TelNr | preceding-sibling::Kunde[Nr = $assocnum]/TelNr" />
              <p>
              <i><xsl:value-of select="position()" /></i>&#160;
              xsl:choose
               <xsl:when test="Assoziierter_Kunde = 0 and Nr = $assoc">
                  <b>ja</b>&#160;
                      <xsl:if test="$telnum1"><u>telnumm assoc.k:(<xsl:value-of select="$telnum1" />)</u>&#160;</xsl:if>
                  (nummer:<xsl:value-of select="Nr" /> / assoc.kunde:<xsl:value-of select="Assoziierter_Kunde" /> / telnum:<xsl:value-of select="TelNr" />)
               </xsl:when>

            <xsl:when test="Assoziierter_Kunde = 0 and not(Nr = $assoc)">
                  <b>nein</b>&#160;
                     <xsl:if test="$telnum1"><u>telnumm assoc.k:(<xsl:value-of select="$telnum1" />)</u>&#160;</xsl:if>
                  (nummer:<xsl:value-of select="Nr" /> / assoc.kunde:<xsl:value-of select="Assoziierter_Kunde" /> / telnum:<xsl:value-of select="TelNr" />)
               </xsl:when>

            xsl:otherwise
                  trifft keines zu&#160;
                     <xsl:if test="$telnum2"><u>telnumm assoc.k:(<xsl:value-of select="$telnum2" />)</u>&#160;</xsl:if>
                  (nummer:<xsl:value-of select="Nr" /> / assoc.kunde:<xsl:value-of select="Assoziierter_Kunde" /> / telnum:<xsl:value-of select="TelNr" />)
               </xsl:otherwise>
              </xsl:choose>

            </p>
            </xsl:for-each>

            </body>
            </html>
              </xsl:template>
            </xsl:stylesheet>

  2. Hallo zusammen,
    ich moechte per xslt folgende Bedingungen auf untenstehende Baumstruktur anwenden,weiss aber nicht wie?!
    Dieses sind die Bedingungen:
    Wenn das Element <Assoziierter_Kunde> eine 0 enthaelt und gleichzeitig der jeweilige Kunde (wenn wir von oben anfangen
    also der mit der Nr. 74614) in dem <Assoziierter_Kunde>-Element eines ANDEREN Kunden auftaucht (in untenstehendem Bsp.
    also bei dem Kunden mit der Nr. 85012), moechte ich "ja" ausgeben.
    Andersherum, wenn das <Assoziierter_Kunde>-Element eines Kunden 0 enthaelt, die KundenNr. dieses Kunden aber NICHT
    in dem <Assoziierter_Kunde>-Element eines anderen Kunden auftaucht, bedeutet das "nein".

    <Kunde>
      <Nr>74614</Nr>
      <Assoziierter_Kunde>0</Assoziierter_Kunde>
    </Kunde>
    <Kunde>
      <Nr>74616</Nr>
      <Assoziierter_Kunde>0</Assoziierter_Kunde>
    </Kunde>
    <Kunde>
      <Nr>85012</Nr>
      <Assoziierter_Kunde>74614</Assoziierter_Kunde>
    </Kunde>
    <Kunde>
      <Nr>92321</Nr>
      <Assoziierter_Kunde>0</Assoziierter_Kunde>
    </Kunde>
    <Kunde>
      <Nr>74615</Nr>
      <Assoziierter_Kunde>74616</Assoziierter_Kunde>
    </Kunde>

    Ich komme einfach nicht weiter - das ist alles was ich habe:

    xsl:choose
    <xsl:when test="Assoziierter_Kunde[.='0'] and Assoziierter_Kunde[.=???]">
        xsl:textja</xsl:text>
      </xsl:when>
      <xsl:when test="Assoziierter_Kunde[.=???]">
        xsl:textnein</xsl:text>
      </xsl:when>
    </xsl:choose>

    Ich arbeite mit apply-templates.
    Faellt vielleicht jemandem ein Loesungsansatz ein?
    Vielen Dank im Vorraus,
    Katja

    Hallo !

    Hab die Unterlagen dazu auf der Arbeit ! Werd da morgen mal nachschauen !