0

xml と xslt を使用してシンボリック デリバタをコーディングする必要があります。そのため、xml で数学関数のツリーを作成し、xslt は関数の各式を導出する必要があります。例: "y = 2x^2 + 3x^5" したがって、"dy/dx= (2*2)x^(2-1) + (3*5)^(5-1) = 4x + 15x^4 xml は次のようになります。

<function>
    <expression>
        <coefficient>2</coefficient>
        <variable>x</variable>
        <exponent>2</exponent>
        <sign>+</sign> <!-- Sign operating with the next expression (+,-,x,/) -->
    </expression>
    <expression>
        <coefficient>3</coefficient>
        <variable>x</variable>
        <exponent>5</exponent>
        <sign></sign>
    </expression>
</function>

私が抱えている問題は、変数 i を xslt で宣言したいので、expression[i]/sign="+" がチェーン ルールを実行し、i=i+1 で次の式に進むときに、これを実行できることです。ただし、for-eachexpression[i]/sign="x" の場合、i=3 の場合は "expression[3] x expression[4]" であるため、積のルールを実行して i=i+2 の 2 つのステップをジャンプする必要があります。 、したがって、式[4]を再度導出したくありません。では、変数の値を変更できないため、どうすれば xslt でこれを行うことができますか? 4x^3(5x^2+2x^7) を表現したい場合は、xml 構造を変更する必要があります。xslt コードはどうすればよいでしょうか?

4

1 に答える 1

0

XSLT 2.0 を想定しています。そうでない場合はお知らせください。

このスタイルシートは、二項式でのみ機能し、'+' または '-' の符号値でのみ機能します。

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

<xsl:output omit-xml-declaration="yes" encoding="UTF-8"/>  
  <xsl:strip-space elements="*" /> 

<xsl:template match="function">
  <xsl:copy>
    <xsl:variable name="expressions" as="element(expression)*">
      <xsl:apply-templates select="expression" mode="differentiate"/>
    </xsl:variable>
    <xsl:for-each-group select="$expressions" group-by="concat(variable,'^',exponent)">
      <xsl:sort select="exponent" data-type="number" order="ascending" />
      <expression>
        <xsl:variable name="signed-coefficient" select="sum(coefficient)" />
        <coefficient><xsl:value-of select="abs( $signed-coefficient)" /></coefficient>
        <variable><xsl:value-of select="current-group()[1]/variable" /></variable>
        <exponent><xsl:value-of select="current-group()[1]/exponent" /></exponent>
        <sign><xsl:value-of select="if ($signed-coefficient ge 0) then '+' else '-'" /></sign>
      </expression> 
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

<xsl:template match="expression" mode="differentiate">
  <xsl:copy>
    <coefficient><xsl:value-of select="
      for $x in coefficient * exponent return
        if (sign = '-') then - $x
                        else   $x" /></coefficient>
    <variable><xsl:value-of select="variable" /></variable>
    <exponent><xsl:value-of select="exponent - 1" /></exponent>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

テンプレートを追加することで、このソリューションを簡単に拡張して、他の形式の式 (および符号の他の値) を含めることができます。各テンプレートは、異なる差別化ルール (チェーン ルール、積ルールなど) を処理します。

于 2015-08-13T02:03:11.703 に答える