Announcement

Collapse
No announcement yet.

zählen von attributen mit bestimmten werten

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

  • zählen von attributen mit bestimmten werten

    Hallo da,

    ich versuch attribute zu zählen die einen bestimmten wert aufweisen.

    hier mein lösungsansatz der nicht geht:

    Code:
    <services>
       <element type="uint8" size="6" name="value">
          <description>
          </description>
       </element>
       <element type="uint8" size="6" name="value">
          <description>
          </description>
        </element>
       <element type="sint8" size="6" name="value">
          <description>
          </description>
       </element>
    </services>
    Code:
    <xsl:template match="services">
       
       <xsl:text>
       test
       </xsl:text>
          
       <xsl:call-template name="template_type_counter">
          <xsl:with-param name="param_u8_count" select="0"/>
          <xsl:with-param name="param_s8_count" select="0"/>
       </xsl:call-template>
    
       <xsl:text>
       endtest
       </xsl:text>   
      
    </xsl:template>
    
    
    
    <xsl:template name="template_type_counter">
       <xsl:param name="param_u8_count"/>
       <xsl:param name="param_s8_count"/>
    
       <xsl:text> start 
    </xsl:text><xsl:value-of select="$param_u8_count"/><xsl:text>
    </xsl:text>
       
      
       <xsl:for-each select="/element">
       
    
          <xsl:value-of select="$param_u8_count"/><xsl:text>
    </xsl:text><xsl:value-of select="@type"/><xsl:text>
    </xsl:text>
             
             <xsl:choose>
                <xsl:when test="@type = 'uint8'">
                   <xsl:call-template name="template_type_counter">
                      <xsl:with-param name="param_u8_count" select="$param_u8_count + 1"/>
                      <xsl:with-param name="param_s8_count" select="$param_s8_count"/>
                   </xsl:call-template>
                </xsl:when>
                <xsl:when test="@type = 'sint8'">
                   <xsl:call-template name="template_type_counter">
                      <xsl:with-param name="param_u8_count" select="$param_u8_count"/>
                      <xsl:with-param name="param_s8_count" select="$param_s8_count + 1"/>
                   </xsl:call-template>
                </xsl:when>
             </xsl:choose>
             
    
          
       </xsl:for-each>
    
       <xsl:if test="position() = last()">
          <xsl:text>
          </xsl:text><xsl:value-of select="$param_u8_count"/><xsl:text>
          </xsl:text><xsl:value-of select="$param_s8_count"/>
       </xsl:if>
    
    </xsl:template>
    
    
    </xsl:stylesheet>
    bitte hilf mir jemand diese lösung zu korrigieren um auf das gewünschte ergebnis zu kommen - ein anderer lösungsansatz ist zwar auch interessant aber ich würde hier gerne meinen fehler finden.

  • #2
    Erkläre bitte, was genau du erreichen willst, am besten, indem du zu dem XML-Eingabe-Beispiel, das du gepostet hast, die Ausgabe postest, die du per XSLT erreichen willst.
    Wenn du einfach bestimmte Knoten zählen willst, dann braucht man dafür kein Template, das man rekursiv aufruft, ein XPath-Ausdruck wie
    Code:
    count(element[@type = 'uint8'])
    im template match="services" reicht, um die Kindselemente mit Namen 'element' zu zählen, die für das "type"-Attribut den Wert "uint8" haben.

    Comment


    • #3
      das ergebnis aus code 1 = xml mit hilfe von code 2 = xslt sollte sein

      und ausgegeben werden von

      <xsl:if test="position() = last()">
      <xsl:text>
      </xsl:text><xsl:value-of select="$param_u8_count"/><xsl:text>
      </xsl:text><xsl:value-of select="$param_s8_count"/>
      </xsl:if>


      ergebnis:
      Code:
      anzahl uint8: 2
      anzahl sint8: 1
      ich weiß dies kann man durch eine key() function lösen und das habe ich auch schon - nur dieses beispiel das ich gepostet habe - du kannst es ja ausprobieren (hoffe sind keine großen fehler drinn) sollte doch auch funktionieren

      ablauf:
      1. ich rufe das template
      2. gehe in die for-each schleife (damit arbeite ich alle element knoten ab)
      3. je nachdem welcher tpy im knoten element als attribut angegeben ist ruf ich das template wieder auf und erhöh die var die es betrifft (für knoten eins also param_u8_count).
      4. ich befinde mich beim erneuten aufruf der schleife in element[1] das bedeutet denke ich dass er jetzt beim weiteren aufruf von for-each in element[2] springt oder?
      5. daraus folgt wiederum ein aufruf von sich selber und ein inkrementieren von param_u8_count...


      vielleicht kann mir nun jemand helfen wo mein denkfehler ist?

      ich möchte dies ausimplementieren da ich so auch die möglichkeit habe den erhöhungswert (der jetzt nur +1 ist) ändern kann - (z.B. + attribut x * attribut y usw.)

      Comment

      Working...
      X