Announcement

Collapse
No announcement yet.

Hilfe bei einer for-each Anweisung

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

  • Hilfe bei einer for-each Anweisung

    Hallo,
    ich bin ziemlicher Anfänger und brauche Hilfe für folgende Aufgabe.
    Ich habe einen Node-Set in der folgenden Form in einer variablen "cn" abgelegt:

    <LDAP-search-results>

    * <result>
    o <DN>cn=sampleQCF,o=jndiTest</DN>
    o <attribute-value name="javaReferenceAddress">#0#VER#6</attribute-value>
    o <attribute-value name="javaReferenceAddress">#1#TRAN#0</attribute-value>
    o <attribute-value name="javaReferenceAddress">#2#QMGR#QM_mqhost</attribute-value>
    o <attribute-value name="javaReferenceAddress">#3#HOST#localhost</attribute-value>
    o <attribute-value name="javaReferenceAddress">#4#PORT#1414</attribute-value>
    o <attribute-value name="javaReferenceAddress">#5#CHAN#SYSTEM.DEF.SVR CONN</attribute-value>
    o <attribute-value name="javaReferenceAddress">#6#CCS#819</attribute-value>
    o <attribute-value name="javaReferenceAddress">#7#CT#</attribute-value>
    o <attribute-value name="javaReferenceAddress">#8#CTO#0</attribute-value>
    o <attribute-value name="javaReferenceAddress">#9#SRC#0</attribute-value>
    o <attribute-value name="javaReferenceAddress">#10#SFIPS#false</attribute-value>
    o <attribute-value name="javaReferenceAddress">#11#SPAG#false</attribute-value>
    o <attribute-value name="javaReferenceAddress">#12#UCP#true</attribute-value>
    o <attribute-value name="javaReferenceAddress">#13#PINT#5000</attribute-value>
    o <attribute-value name="javaReferenceAddress">#14#MBS#10</attribute-value>
    o <attribute-value name="javaReferenceAddress">#15#FIQ#1</attribute-value>
    o <attribute-value name="javaReferenceAddress">#16#LA#</attribute-value>
    o <attribute-value name="javaReferenceAddress">#17#RINT#5000</attribute-value>
    o <attribute-value name="javaReferenceAddress">#18#TCM#true</attribute-value>
    o <attribute-value name="javaReferenceAddress">#19#TM#QUEUE.TEMP</attribute-value>
    o <attribute-value name="javaReferenceAddress">#20#TQPFX#</attribute-value>
    o <attribute-value name="javaReferenceAddress">#21#MRET#1</attribute-value>
    </result>

    </LDAP-search-results>


    In einer for-each schleife möchte ich die einzelnen Attribute extrahieren:

    <!-- select="$cn//attribute-value" -->

    <xsl:for-each select="$cn/LDAP-search-results/result/attribute-value">
    <xsl:choose>
    <xsl:when test="contains($cn/LDAP-search-results/result/attribute-value,'#0#VER#')">
    <xsl:variable name="ver" select="substring-after($cn/LDAP-search-results/result/attribute-value,'#0#VER#')"/>
    </xsl:when>
    <xsl:when test="contains($cn/LDAP-search-results/result/attribute-value,'#1#TRAN#')">
    <xsl:variable name="ver" select="substring-after($cn/LDAP-search-results/result/attribute-value,'#1#TRAN#')"/>
    </xsl:when>
    </xsl:choose>
    </xsl:for-each>

    Als Ergebnis erhalte ich immer nur das erste Attribute - 6


    Kann mir Jemand helfen - was mache ich falsch - wieso werden nicht aller Attribute nacheinander selektiert ?

    Für eine rasche Hilfe bin ich äusserst dankbar

    Viele Grüsse
    Sepp

  • #2
    Offenbar soll jeweils die Zeichenkette nach dem letzten #-Zeichen ausgegeben werden. Mittels XPath 2.0 ist das so möglich:

    Code:
    fn:tokenize($cn/LDAP-search-results/result/attribute-value,'#')[last()]
    Ermittele alternativ die Position des letzten #-Zeichens und verwende die substring()-Funktion, die ohne dritten Parameter den String bis zum Ende abgreift.

    Comment


    • #3
      for-each schleife

      Danke Thomas für die rasche Antwort :-)
      Sorry, dass ich mich nicht richtig ausgedrückt habe.
      Die Ausgabe des Zeichens funktioniert schon.

      Mein XPATH in der for schleife erhält aber anscheind nie den Wert #1#TRAN#0.
      Es sieht so aus, also ob "$cn/LDAP-search-results/result/attribute-value" nur den 1.Wert aus der attribute-value Liste liefert ('#0#VER#')

      Also was ich möchte ist, dass die Variable "ver" den Wert '6'
      und die Variable "tran" den Wert '0' erhält (ich hatte mich im ersten Post verschrieben).
      Anstatt nun jedes Attribute einfach durchzugehen, den Stringvergleich zu machen und dann die Variable entsprechend zu setzen, bleibt der Wert bei jedem Schleifendurchlauf immer nur der Wert der ersten Variable - es scheint so also würden die anderen attribute-value gar nie durchlaufen.


      <xsl:when test="contains($cn/LDAP-search-results/result/attribute-value,'#0#VER#')">
      <xsl:variable name="ver" select="substring-after($cn/LDAP-search-results/result/attribute-value,'#0#VER#')"/>
      </xsl:when>
      <xsl:when test="contains($cn/LDAP-search-results/result/attribute-value,'#1#TRAN#')">
      <xsl:variable name="tran" select="substring-after($cn/LDAP-search-results/result/attribute-value,'#1#TRAN#')"/>

      Comment


      • #4
        Ändere die Referenzierung in dieser Weise ab (Punkt für den jeweiligen Kontextknoten, also den Inhalte der attribute-value-Elemente):

        Code:
        <xsl:for-each select="$cn/LDAP-search-results/result/attribute-value">
          <xsl:choose>
            <xsl:when test="contains(.,'#0#VER#')">
              <xsl:variable name="ver" select="substring-after(.,'#0#VER#')"/>
            </xsl:when>
            <xsl:when test="contains(.,'#1#TRAN#')">
              <xsl:variable name="ver" select="substring-after(.,'#1#TRAN#')"/>
            </xsl:when>
          </xsl:choose>
        </xsl:for-each>

        Comment


        • #5
          Hallo Thomas, genau das läuft bei mir eben nicht - da muss etwas anderes nicht stimmen (siehe mein erstes Post).
          Ich hatte es genau so gemacht - komisch, da muss was anderes klemmen.
          Vielen Dank


          AHH, nein, jetzt erst sehe was du anders gemacht hast - sorry - das probier ich gleich aus.

          Comment

          Working...
          X