Raspu: Exponenten

Hallo,
ich möchte gerne den Wert 1.5^(-h1) durch xsl berechnen lassen.
h1 ist hierbei ein Wert der aus einer xml ausgelesen werden muss.
Geht das?

Raspu

  1. Hallo Raspu,

    ich möchte gerne den Wert 1.5^(-h1) durch xsl berechnen lassen.
    h1 ist hierbei ein Wert der aus einer xml ausgelesen werden muss.
    Geht das?

    Fertige Potenz-, Logarithmus- oder gar Winkelfunktionen gibt es unter XSLT/XPath 1.0 und 2.0 nicht.

    Da Du in anderen Postings die XSLT-Version 2.0 angegeben hast, wäre eine mittels xsl:function definierte Funktion möglich (unter XSLT 1.0 durch rekursive Templateaufrufe abbildbar).

    In meiner kleinen mathematischen Bibliothek (primär für Sinus/Kosinus umgesetzt) gibt es die Funktion tm:pow(), welche für nichtnegative ganzzahlige Exponenten ausgelegt ist [1 div tm:pow(1.5,h1) wäre also bei passendem h1 möglich]. Baue ggf. eine alternative Funktion. Dieses Test-Stylesheet zeigt den Aufruf der Funktionen (zum Testen einfach gegen ein Dummy-XML-Dokument wie <root/> anwenden).

    Grüße,
    Thomas

    1. Nachtrag:

      Da in der Funktionsbibliothek auch tm:ln() und tm:exp() vorhanden sind, können Potenzen auch alternativ ermittelt werden, allerdings nur näherungsweise:

      x^z kann umgeschrieben werden in tm:exp(z*tm:ln(x))

      Somit lassen sich nichtganzzahlige Exponenten verwenden, allerdings keine keine x<=0.

      Beispiele (mit 15 Gliedern in den Reihenentwicklungen):

      <xsl:text>2^3 = </xsl:text><xsl:value-of select="tm:exp(3*tm:ln(2))"/><!-- 7.99999998 -->  
        
      <xsl:text>2^-3 = </xsl:text><xsl:value-of select="tm:exp(-3*tm:ln(2))"/><!-- 0.125 -->  
        
      <xsl:text>2.5^3.5 = </xsl:text><xsl:value-of select="tm:exp(3.5*tm:ln(2.5))"/><!-- 24.7052867 -->  
        
      <xsl:text>2.5^-3.5 = </xsl:text><xsl:value-of select="tm:exp(-3.5*tm:ln(2.5))"/><!-- 0.04047213 -->
      

      Grüße,
      Thomas