使用xml和xslt派生

时间:2015-08-12 05:23:43

标签: xml xslt data-driven

我需要使用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代码?

1 个答案:

答案 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>

您可以通过添加模板轻松扩展此解决方案以包含其他形式的表达式(以及其他符号值),每个模板处理不同的区分规则(例如,链规则,产品规则等)。