所以我在我的作业中基本上停留在这部分,由于我在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) > 0 and count($list2) > 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>
我无法获取变量$ subTotal来保存任何值,即使上面显示的第二个代码的模板调用被替换为&#34; value-of select =&#39; item / @ qty&#39;它仍然会返回错误。
答案 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) > 0 and count($list2) > 0">
<xsl:call-template name="sumProduct">
<xsl:with-param name="list1" select="$list1[position()>1]"/>
<xsl:with-param name="list2" select="$list2[position()>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()>1]"
:在递归调用模板时,传递除list1
参数的第一个元素以外的所有元素。同样的规则适用于list2
参数。select="$sumProductTotal + $list1[1]*$list2[1]"
:在递归调用模板时,传递当前值sumProductTotal
加上当前list1
和list2
参数的第一个元素的乘积值。< / LI>
<xsl:value-of select="$sumProductTotal"/>
:当要处理list1
和list2
参数中的其他项目时,只需返回sumProductTotal
值。旁注:
以下部分缺少 order
步骤,因为根据示例XML,item
是order
的子项,而此处的当前上下文元素是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>