Announcement

Collapse
No announcement yet.

Knotenliste, Wert suchen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Knotenliste, Wert suchen

    Hallo,

    Ich habe den unten abgebildeten XML-Code.
    Ich muss den Namen (T_PRO_HIS.MODIFY_NAME) aus dem Knoten finden, bei dem zum letzten mal der T_PRO_HIS.OLD_LEV_IND = 128 steht. Dieser Wert kann auch in mehreren Knoten auf 128 stehen, ich brauche aber unbedingt den letzten!
    Das Gleiche brauche ich auch für 123 und für den Range von 112-119 ...
    Ich hatte mir zwar schon etwas gebastelt, funktionierte dann leider nicht, da die "Variablen" schlecht änderbar sind :-(
    Leider bin ich X-Anfänger und mit meinem Latein am Ende.
    Kann mir bitte jemand helfen?

    DANKE!

    Code:
    <dataarea-ref_01 name="EDB-PRO-HIS-RLI">
       <records>
          <record no="1" >      
            <T_PRO_HIS.MODIFY_NAME><![CDATA[WITTEA]]></T_PRO_HIS.MODIFY_NAME>
            T_PRO_HIS.OLD_LEV_IND><![CDATA[112]]></T_PRO_HIS.OLD_LEV_IND>
            <T_PRO_HIS.NEW_LEV_IND><![CDATA[126]]></T_PRO_HIS.NEW_LEV_IND>
            <T_PRO_HIS.ECO_REF><![CDATA[]]></T_PRO_HIS.ECO_REF>
            <T_PRO_HIS.C_VERSION><![CDATA[1]]></T_PRO_HIS.C_VERSION>
          </record>
          <record no="2" >        
            <T_PRO_HIS.MODIFY_NAME><![CDATA[WITTEA]]></T_PRO_HIS.MODIFY_NAME>        
            <T_PRO_HIS.OLD_LEV_IND><![CDATA[126]]></T_PRO_HIS.OLD_LEV_IND>        
            <T_PRO_HIS.ECO_REF><![CDATA[]]></T_PRO_HIS.ECO_REF>
            <T_PRO_HIS.C_VERSION><![CDATA[1]]></T_PRO_HIS.C_VERSION>
          </record>
          <record no="3" >        
            <T_PRO_HIS.MODIFY_NAME><![CDATA[WITTEA]]></T_PRO_HIS.MODIFY_NAME>        
            <T_PRO_HIS.OLD_LEV_IND><![CDATA[117]]></T_PRO_HIS.OLD_LEV_IND>        
            <T_PRO_HIS.ECO_REF><![CDATA[]]></T_PRO_HIS.ECO_REF>
            <T_PRO_HIS.C_VERSION><![CDATA[1]]></T_PRO_HIS.C_VERSION>
          </record>
          <record no="4" >        
            <T_PRO_HIS.MODIFY_NAME><![CDATA[PAPKE]]></T_PRO_HIS.MODIFY_NAME>        
            <T_PRO_HIS.OLD_LEV_IND><![CDATA[126]]></T_PRO_HIS.OLD_LEV_IND>
            <T_PRO_HIS.ECO_REF><![CDATA[]]></T_PRO_HIS.ECO_REF>
            <T_PRO_HIS.C_VERSION><![CDATA[1]]></T_PRO_HIS.C_VERSION>
          </record>
          <record no="5" >
            <T_PRO_HIS.MODIFY_NAME><![CDATA[SIWCZYK]]></T_PRO_HIS.MODIFY_NAME>
            <T_PRO_HIS.OLD_LEV_IND><![CDATA[128]]></T_PRO_HIS.OLD_LEV_IND>
            <T_PRO_HIS.ECO_REF><![CDATA[]]></T_PRO_HIS.ECO_REF>
            <T_PRO_HIS.C_VERSION><![CDATA[1]]></T_PRO_HIS.C_VERSION>
          </record>
          <record no="6" >
            <T_PRO_HIS.MODIFY_NAME><![CDATA[DORFF]]></T_PRO_HIS.MODIFY_NAME>
            <T_PRO_HIS.OLD_LEV_IND><![CDATA[119]]></T_PRO_HIS.OLD_LEV_IND>
            <T_PRO_HIS.ECO_REF><![CDATA[]]></T_PRO_HIS.ECO_REF>
            <T_PRO_HIS.C_VERSION><![CDATA[1]]></T_PRO_HIS.C_VERSION>
          </record>
          <record no="7" >
            <T_PRO_HIS.MODIFY_NAME><![CDATA[SIWCZYK]]></T_PRO_HIS.MODIFY_NAME>
            <T_PRO_HIS.OLD_LEV_IND><![CDATA[128]]></T_PRO_HIS.OLD_LEV_IND>
            <T_PRO_HIS.ECO_REF><![CDATA[]]></T_PRO_HIS.ECO_REF>
            <T_PRO_HIS.C_VERSION><![CDATA[1]]></T_PRO_HIS.C_VERSION>
          </record>
       </records>

  • #2
    Ansatz:
    Code:
    <xsl:for-each select="//record/T_PRO_HIS.OLD_LEV_IND">
      <xsl:if test=".='128' and position()=last()">
        <xsl:value-of select="../T_PRO_HIS.MODIFY_NAME"/>
      </xsl:if>
    </xsl:for-each>

    Comment


    • #3
      Hallo,

      erstmal Danke für deine schnelle Antwort. Zweitens Entschuldigung, meine Problembeschreibung war nicht präzise genug. Ich suche nicht den letzten Knoten (im Sinne von es ist der letzte Knoten der Liste) sondern den letzten Knoten des Auftretens.

      Mit deinem (leicht angepassten) Ansatz:

      Code:
      <xsl:for-each select="//report/dataarea-ref_01/records/record/T_PRO_HIS.OLD_LEV_IND"> 
       <xsl:if test=".=128">
        <fo:block>
         <xsl:value-of select="../T_PRO_HIS.MODIFY_NAME"
        </fo:block>
       </xsl:if>				
      </xsl:for-each>
      Bekomme ich jetzt alle MODIFY_NAME aus den Knoten in welchen der OLD_LEV_IND = 128 ist. Super. Aber ich möchte eigentlich nur den letzten gefundenen. Wie kann man das noch hinbiegen?
      Thanks in advance ...

      Comment


      • #4
        Ich hatte die Bedingung position()=last() bereits genannt.

        Comment


        • #5
          Sorry,

          jetzt (glaube) ich zu verstehen. last() liefert ja in diesem Falle nicht den letzten Knoten der gesamten Knotenliste, sondern den letzten der matched - also genau den, den ich suche ...

          Danke. Ich glaube damit ist mein Problem gelöst!!!!

          Comment


          • #6
            Leider doch nicht ... :-(

            Es funktiniert leider doch noch nicht so wie gewünscht.
            Der folgende Code liefert mir nur den Namen zurück, wenn dieser zufällig auch der letzte Knoten in der Liste ist.
            Ich brauche aber den letzten auftretenden Knoten mit Lev_IND = 128 um dann aus diesem Knoten den Namen zu holen.
            mit position()=last() teste ich doch ob der aktuelle Knoten der letzte in der KnotenListe ist, das will ich aber gar nicht wissen.
            :-(
            Kann ich alle Knoten (record) zählen bei der T_PRO_HIS.OLD_LEV_IND auf einem bestimmten Wert steht?
            Wenn ich dies könnte und dann z.B. wüsste das ich 3 Knoten habe bei denen LEV_IND auf 128 steht köte ich doch dann mit ner weiteren Schleife prüfen ob position() = 3, dann hätte ich den richtigen gefunden ...


            Code:
            <xsl:for-each select="//report/dataarea-ref_01/records/record/T_PRO_HIS.OLD_LEV_IND">
             <xsl:if test=".='126' and position()=last()">
              <fo:block>
               <xsl:value-of select="../T_PRO_HIS.MODIFY_NAME"/>
              </fo:block>
             </xsl:if>
            </xsl:for-each>

            Comment


            • #7
              OK, das sollte wohl eher so aussehen:
              Code:
              <xsl:for-each select="//report/dataarea-ref_01/records/record/T_PRO_HIS.OLD_LEV_IND[.='126']">
               <xsl:if test="position()=last()">
                <fo:block>
                 <xsl:value-of select="../T_PRO_HIS.MODIFY_NAME"/>
                </fo:block>
               </xsl:if>
              </xsl:for-each>

              Comment


              • #8
                Danke Thomas.
                Jetzt funktioniert es so wie gewünscht.

                Nochmals Danke.

                Comment

                Working...
                X