XSL:递归调用

时间:2015-06-06 15:32:31

标签: xml xslt

所以我在我的作业中基本上停留在这部分,由于我在xml中的noob技能,我无法解决这个问题。 这是hdfunction.xsl中的模板:

 <xsl:template name="sumProduct">
    <xsl:param name="list1"/>
    <xsl:param name="list2"/>
    <xsl:param name="sumProductTotal" select="0"/>
 <xsl:choose>
    <xsl:when test="count($list1) &gt; 0 and count($list2) &gt; 0">
        <xsl:call-template name="sumProduct">
            <xsl:with-param name="list1" select="$list1"/>
            <xsl:with-param name="list2" select="$list2"/>
            <xsl:with-param name="sumProductTotal" select="current()/$sumProductTotal + $list1"/>      
        </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
</xsl:choose>
</xsl:template>

另一个持有此相关代码的xsl:

  <xsl:include href="hdfunctions.xsl"/>
  <xsl:template match="/">
     <html>
     <body>
     <p><xsl:value-of select="$subTotal"/></p>
     </body>
     </html>
    <xsl:apply-templates select="order[@custID='cust2222']"/>
  </xsl:template>

<xsl:template match="orders">
    <xsl:variable name="subTotal">
        <xsl:call-template name="sumProduct">
            <xsl:with-param name="list1" select="item/@qty"/>
            <xsl:with-param name="list2" select="item/@price"/>
        </xsl:call-template>
    </xsl:variable>
</xsl:template>

最后是xml文档:

<orders>
  <order orderID="4122" custID="cust2222" orderDate="11/1/2017" shipping="8.95" tax="6.21">

  <item itemID="DH007" qty="1" price="74.99" />
  <item itemID="BD002" qty="3" price="40.99" />
  <item itemID="BH003" qty="1" price="21.99"/>
  <item itemID="DR002" qty="1" price="20.99"/>
  <item itemID="KR009" qty="1" price="53.99" />
  </order>
  </orders>

enter image description here

我无法获取变量$ subTotal来保存任何值,即使上面显示的第二个代码的模板调用被替换为&#34; value-of select =&#39; item / @ qty&#39;它仍然会返回错误。

1 个答案:

答案 0 :(得分:1)

您可以尝试以这种方式实施sumProduct模板:

<xsl:template name="sumProduct">
    <xsl:param name="list1" />
    <xsl:param name="list2" />
    <xsl:param name="sumProductTotal" select="0"/>

    <xsl:choose>
        <xsl:when test="count($list1) &gt; 0 and count($list2) &gt; 0">
            <xsl:call-template name="sumProduct">
                <xsl:with-param name="list1" select="$list1[position()&gt;1]"/>
                <xsl:with-param name="list2" select="$list2[position()&gt;1]"/>
                <xsl:with-param name="sumProductTotal" select="$sumProductTotal + $list1[1]*$list2[1]"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$sumProductTotal"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

简要说明:

  • select="$list1[position()&gt;1]":在递归调用模板时,传递除list1参数的第一个元素以外的所有元素。同样的规则适用于list2参数。
  • select="$sumProductTotal + $list1[1]*$list2[1]":在递归调用模板时,传递当前值sumProductTotal加上当前list1list2参数的第一个元素的乘积值。< / LI>
  • <xsl:value-of select="$sumProductTotal"/>:当要处理list1list2参数中的其他项目时,只需返回sumProductTotal值。

旁注:

以下部分缺少

order步骤,因为根据示例XML,itemorder的子项,而此处的当前上下文元素是orders

<xsl:template match="orders">
    <xsl:variable name="subTotal">
        <xsl:call-template name="sumProduct">
            <xsl:with-param name="list1" select="order/item/@qty"/>
            <xsl:with-param name="list2" select="order/item/@price"/>
        </xsl:call-template>
    </xsl:variable>
</xsl:template>