martin.mistery: XSL Problem

Hi zusammen,

ich bin nicht so vertraut mit XSL.

Folgendes problemchen habe ich, hier ein Beispiel XML (Daten erfunden)

<data>
<Pos: 10>
<Material:Gabel>
<Aktuell: nein>
<Kenner:10550>

<Pos: 10>
<Material:Gabel>
<Aktuell: nein>
<Kenner:10540>
…
<Pos: 10>
<Material:Gabel>
<Aktuell: ja>
<Kenner:10310>

<Pos: 20>
<Material:Löffel>
<Aktuell: ja>
<Kenner:10330>

<Pos: 20>
<Material:Löffel>
<Aktuell: nein>
<Kenner:10540>

<Pos: 30>
<Material:Ball>
<Aktuell: ja>
<Kenner:11110>

<Pos: 30>
<Material:Ball>
<Aktuell: nein>
<Kenner:10540>
</data>

<Pos: 30>
<Material:Ball>
<Aktuell: nein>
<Kenner:10550>

Ich möchte folgendes ausgeben über XSL

Pos | Material | Aktuell | Kenner |----| 10 | Gabel | nein | 10540 20 | Löffel | ja | 10330 30 | Ball | nein | 10540

Die Regel hierfür ist folgendes: Wenn aktuelle Position (Aktuell: Ja) grösser gleich 10330, dann wird dieser ausgegeben. Wenn aktuelle Position (Aktuell: Ja) kleiner 10330, dann soll derjenige aus der gleichen Positionsnummer genommen der Kenner: 10540 hat. Ich habe es über XSL versucht selber zu lösen jedoch kriege ich es nicht hin.Ich bin für jegliche Hilfe über die XSL Lösung sehr dankbar.

Schöne Grüsse Martin

  1. Hallo Martin,

    ich bin nicht so vertraut mit XSL.

    Folgendes problemchen habe ich, hier ein Beispiel XML (Daten erfunden)

    <data>
    <Pos: 10>
    <Material:Gabel>
    <Aktuell: nein>
    <Kenner:10550>
    

    Hä?

    Bitte ein testfähiges (wohlgeformtes) Codebeispiel formulieren und daran die Frage konkretisieren.

    Grüße, Thomas

    1. Hallo Thomas,

      ich hab hier folgende XML:

      <?xml version="1.0" encoding="ISO-8859-1"?>
      <?xml-stylesheet type="text/xsl:fo" href="Artikel.xsl"?>
      <report>
       <dataarea_20 Name="Test">
        <records>
         <record No="1">
          <data>
           <T_MASTER_STR.POS_NO>10</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[10000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[A]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Gabel]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10840</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>n</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="2">
          <data>
           <T_MASTER_STR.POS_NO>10</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[10000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[B]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Gabel]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10110</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>y</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="3">
          <data>
           <T_MASTER_STR.POS_NO>20</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[20000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[B]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Löffel]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10130</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>y</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="4">
          <data>
           <T_MASTER_STR.POS_NO>20</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[20000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[A]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Löffel]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10740</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>n</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="5">
          <data>
           <T_MASTER_STR.POS_NO>30</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[30000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Löffel]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10540</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>n</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="6">
          <data>
           <T_MASTER_STR.POS_NO>30</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[30000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[A]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Ball]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10110</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>y</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="7">
          <data>
           <T_MASTER_STR.POS_NO>40</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[40000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[A]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Kappe]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10350</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>n</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="8">
          <data>
           <T_MASTER_STR.POS_NO>40</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[40000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[B]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Kappe]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10330</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>y</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="9">
          <data>
           <T_MASTER_STR.POS_NO>50</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[50000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[A]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Jacke]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10540</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>n</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
         <record No="10">
          <data>
           <T_MASTER_STR.POS_NO>50</T_MASTER_STR.POS_NO>
           <T_MASTER_DAT.PART_ID><![CDATA[50000]]></T_MASTER_DAT.PART_ID>
           <T_MASTER_DAT.PART_VERSION><![CDATA[B]]></T_MASTER_DAT.PART_VERSION>
           <T_MASTER_DAT.PART_NAME_GER><![CDATA[Jacke]]></T_MASTER_DAT.PART_NAME_GER>
           <T_MASTER_DAT.LEV_IND>10510</T_MASTER_DAT.LEV_IND>
           <T_MASTER_DAT.CUR_FLAG>y</T_MASTER_DAT.CUR_FLAG>
          </data>
         </record>
        </records>
       </dataarea_20>
      </report>
      

      Das XSL hierfür

      <xsl:for-each select="dataarea_20/records/record/[dataarea_20/records/record/data/T_MASTER_DAT.CUR_FLAG = 'y']">
      <xsl:variable name="FK"><xsl:value-of select="data/T_MASTER_DAT.LEV_IND"/></xsl:variable>
      <xsl:if test="$FK > '10330''">
      <xsl:choose>
      <xsl:when test="position() mod 2">
      <fo:table-row>
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_STR.POS_NO"/></fo:block></fo:table-cell>
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.PART_ID"/></fo:block></fo:table-cell>
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.PART_VERSION"/></fo:block></fo:table-cell>
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.LEV_IND"/></fo:block></fo:table-cell>
      </fo:table-row>
      </xsl:when>
      <xsl:otherwise>
      <xsl:if test="string-length(data/T_MASTER_DAT.PART_ID) > 0">
      <fo:table-row>
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_STR.POS_NO"/></fo:block></fo:table-cell>
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.PART_ID"/></fo:block></fo:table-cell>
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.PART_VERSION"/></fo:block></fo:table-cell>
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.LEV_IND"/></fo:block></fo:table-cell>
      </fo:table-row>
      </xsl:if>
      </xsl:otherwise>
      </xsl:choose>
      </xsl:if>
      <xsl:if test="$FK < '10330'">
      <xsl:for-each select="dataarea_20/records/records/data/">
      <fo:table-cell><fo:block padding-top="0.75mm"><xsl:value-of select="T_MASTER_STR.POS_NO"/></fo:block></fo:table-cell>
      </xsl:for-each>
      </xsl:if>
      </xsl:for-each>
      

      Die Regel hierfür sind: Wenn aktueller Artikel (T_MASTER_DAT.CUR_FLAG = y) grösser 10330 ist, dann wird dieser ausgegeben. Wenn aktueller Artikel (T_MASTER_DAT.CUR_FLAG = y) kleiner 10330 dann Überprüfung ob ein anderer Artikel mit der gleichen Position mit 10540, 10740 oder 10840 existiert und gebe diesen dann aus. Mein Problem ist, das mein obriges Code die zweite Schleife nicht durchläuft. Hab alles versucht um zu einer Lösung zu kommen. Für jegliche Hilfe was ich hier falsch gemacht habe oder wie ich es anders machen kann wäre ich sehr dankbar.

      Vielen Dank im Voraus.

      Mfg Martin

      1. Hallo Martin,

        Mein Problem ist, das mein obriges Code die zweite Schleife nicht durchläuft. Hab alles versucht um zu einer Lösung zu kommen. Für jegliche Hilfe was ich hier falsch gemacht habe oder wie ich es anders machen kann wäre ich sehr dankbar.

        ...

        <xsl:if test="$FK < '10330'">

        Der Code mit <-Zeichen kann mangels Wohlgeformtheit gar nicht von einem XSLT-Prozessor verarbeitet werden, bei numerischen Vergleichen sind auch die Anführungszeichen nicht sinnvoll.

        <xsl:if test="$FK &lt; 10330">

        (Bei XSLT 2.0 alternativ auch nur lt für den Kleiner-Vergleich.)

        Grüße, Thomas

        1. Hallo Thomas,

          Möglich das du mal bitte ein Beispiel zeigst wie ich über XSL eine Schleife in der Schleife durchlaufe? Wenn der Datensatz aus Schleife 1 Kriterien nicht erfüllt, dann starte Schleife 2 und suche da nach bestimmten Kriterien. z.B. wenn Datensatz aktuell und grösser 10330 dann ist alles OK, aber wenn der aktuelle Datensatz kleiner 10330 ist, dann starte die zweite Schleife und suche mir den Datensatz wo 10540 ist.

          Ist sowas mit XSL möglich?

          Vielen Dank für Deine Hilfe.

          Mfg Martin

          1. Hallo Martin,

            Möglich das du mal bitte ein Beispiel zeigst wie ich über XSL eine Schleife in der Schleife durchlaufe? Wenn der Datensatz aus Schleife 1 Kriterien nicht erfüllt, dann starte Schleife 2 und suche da nach bestimmten Kriterien. z.B. wenn Datensatz aktuell und grösser 10330 dann ist alles OK, aber wenn der aktuelle Datensatz kleiner 10330 ist, dann starte die zweite Schleife und suche mir den Datensatz wo 10540 ist.

            Ist sowas mit XSL möglich?

            Logik mit xsl:if bzw. xsl:choose / xsl:when / xsl:otherwise exisitiert. Alternativ lassen sich mehrere Templates mit Bedingungen ausstatten und via xsl:apply-templates aufrufen.

            Grüße, Thomas

      2. Hallo Martin,

        habe noch weitere Probleme im XSLT-Code gefunden:

        <xsl:for-each select="dataarea_20/records/record/[dataarea_20/records/record/data/T_MASTER_DAT.CUR_FLAG = 'y']">

        ^^^ müsste lauten:

        <xsl:for-each select="dataarea_20/records/record[data/T_MASTER_DAT.CUR_FLAG = 'y']">

        <xsl:variable name="FK"><xsl:value-of select="data/T_MASTER_DAT.LEV_IND"/></xsl:variable>

        <xsl:if test="$FK > '10330''">

        ^^^ hier stehen zwei schließende '', weg damit, nur den numerischen Vergleich durchführen:

        <xsl:if test="$FK > 10330">

        xsl:choose <xsl:when test="position() mod 2"> fo:table-row fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_STR.POS_NO"/></fo:block></fo:table-cell> fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.PART_ID"/></fo:block></fo:table-cell> fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.PART_VERSION"/></fo:block></fo:table-cell> fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.LEV_IND"/></fo:block></fo:table-cell> </fo:table-row> </xsl:when> xsl:otherwise <xsl:if test="string-length(data/T_MASTER_DAT.PART_ID) > 0"> fo:table-row fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_STR.POS_NO"/></fo:block></fo:table-cell> fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.PART_ID"/></fo:block></fo:table-cell> fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.PART_VERSION"/></fo:block></fo:table-cell> fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="data/T_MASTER_DAT.LEV_IND"/></fo:block></fo:table-cell> </fo:table-row> </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:if>

        <xsl:if test="$FK < '10330'">

        ^^^ wie schon genannt ändern in:

        <xsl:if test="$FK &lt; 10330">

        <xsl:for-each select="dataarea_20/records/records/data/">

        ^^^ hier ist der abschließende / falsch, also:

        <xsl:for-each select="dataarea_20/records/records/data">

        fo:table-cell<fo:block padding-top="0.75mm"><xsl:value-of select="T_MASTER_STR.POS_NO"/></fo:block></fo:table-cell> </xsl:for-each> </xsl:if> </xsl:for-each>

        Grüße, Thomas

        1. Hallo Thomas,

          vielen Dank. Werde es mal ausprobieren.

          Schöne Grüsse Martin