我需要使用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>
我遇到的问题是我想在xslt中声明一个变量i,所以当表达式[i] / sign =&#34; +&#34;它执行链式规则并且i = i + 1所以它转到下一个表达式,我可以使用for-each
执行此操作,但是当表达式[i] / sign =&#34; x&#34;我需要执行产品规则并跳转两步,所以i = i + 2,因为如果i = 3那么&#34;表达式[3] x表达式[4]&#34;,所以我不想再次派生表达式[4]。那么我怎样才能用xslt做这个,因为我无法修改变量的值?如果我想表达4x ^ 3(5x ^ 2 + 2x ^ 7)那么我必须改变我的xml结构,怎么可能是xslt代码?
答案 0 :(得分:0)
我假设是XSLT 2.0。如果不是,请告诉我。
此样式表仅适用于二项式表达式,且仅适用于&#39; +&#39;的符号值。或&#39; - &#39;。
<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>
您可以通过添加模板轻松扩展此解决方案以包含其他形式的表达式(以及其他符号值),每个模板处理不同的区分规则(例如,链规则,产品规则等)。