使用xsl:choose动态定义XSLT变量

时间:2010-02-13 22:26:30

标签: xslt dynamic variables

在我的XSLT电子表格中,我需要根据xml节点的值定义一个或多个值的xsl:变量。下面的代码显示了我正在尝试做的事情。我想用这种方式定义多个变量。

一个主要问题是,为了根据每个项目的节点值选择变量值,必须在xsl:foreach中进行选择,每当我尝试在xsl中定义变量时:foreach它会显示错误

<xsl:for-each select="WORKS/item">

 <xsl:variable name="rate1">
    <xsl:choose>
         <xsl:when test="rental='new'">
            <xsl:value-of select="'.15'" />
        </xsl:when>
         <xsl:when test="rental='used'">
            <xsl:value-of select="'.30'" />
        </xsl:when>
    </xsl:choose>
</xsl:variable>

<xsl:variable name="rent1" select="{$rate1}">

我想通过更改变量值来实现这一目的的原因是因为这些变量随后在数学函数中使用,该函数将变量乘以节点值(价格),该值将与每个变量不同。以下是一旦定义了变量的方法。非常感谢。

    <div class="rental-period">1-4 Days:</div>
    <div class="rental-price"><em>$ <xsl:value-of select='format-number( (100*(price * $rent1) div 100), "###.00" )'/></em></div>

    <div class="rental-period">5-7 Days:</div>
    <div class="rental-price"><em>$ <xsl:value-of select='format-number( (100*(price * $rent2) div 100), "###.00" )'/></em></div>

    <div class="rental-period">8-14 Days:</div>
    <div class="rental-price"><em>$ <xsl:value-of select='format-number( (100*(price * $rent3) div 100), "###.00" )'/></em></div>

更新 好。我已经尝试过Dark Falcon下面提供的解决方案,但它一直给我一个错误“打开和结束标签不匹配”。和以前一样的错误。它似乎不喜欢xsl:选择我拥有它的位置,因为这些行号是错误来自的地方。以下是所有相关的样式表代码:

<xsl:template name="showPrice">
    <xsl:param name="rentalRate"/>
      <div class="rental-price"><em>$ <xsl:value-of select='format-number( (100*(price * $rentalRate) div 100), "###.00" )'/></em></div>
</xsl:template>


<xsl:template match="/">

<xsl:for-each select="WORKS/item">

    <div class="rental-info">

    <xsl:choose>
     <xsl:when test="rental='new'">
        <xsl:call-template name="showPrice">
            <xsl:with-param name="rentalRate" select="'.15'">
        </xsl:call-template>
     </xsl:when>
     <xsl:when test="rental='used'">
        <xsl:call-template name="showPrice">
            <xsl:with-param name="rentalRate" select="'.30'">
        </xsl:call-template>
     </xsl:when>
    </xsl:choose>

        </div>

</xsl:for-each>

</xsl:template>

4 个答案:

答案 0 :(得分:13)

我认为您的初始代码唯一的问题基本上如下:

<xsl:variable name="rent1" select="number($rate1)">

(否{},因为它是select,您可能希望在该变量中有一个数字,而不是字符串。)

所以这就是这样的:

<xsl:variable name="rate1">
  <xsl:choose>
    <xsl:when test="rental='new'">0.15</xsl:when>
    <xsl:otherwise>0.30</xsl:otherwise>
  </xsl:choose>
</xsl:variable>
<xsl:variable name="rent1" select="number($rate1)">

答案 1 :(得分:3)

知道了。这是最终工作的代码。解决方案是使用“number()”并直接调用变量而不是首先定义变量的组合。谢谢大家。

<xsl:variable name="rate">
    <xsl:choose>
         <xsl:when test="rental='new'">
            <xsl:value-of select="'.15'" />
        </xsl:when>
          <xsl:otherwise>
        <xsl:value-of select="'.30'"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<div class="rental-price"><em>$ <xsl:value-of select='format-number( (100*(price * number($rate)) div 100), "###.00" )'/></em></div>

答案 2 :(得分:0)

这可能不是最好的方法,但是:

我建议您将用于显示价格的逻辑分解为模板,然后使用

<xsl:choose>
     <xsl:when test="rental='new'">
        <xsl:call-template name="showPrice">
            <xsl:with-param name="rent" select="'.15'" />
        </xsl:call-template>
     </xsl:when>
     <xsl:when test="rental='used'">
        <xsl:call-template name="showPrice">
            <xsl:with-param name="rent" select="'.30'" />
        </xsl:call-template>
     </xsl:when>
</xsl:choose>

答案 3 :(得分:0)

试试这个:

<xsl:variable name="rate">
    <xsl:if test="rental='new'">.15</xsl:if>
    <xsl:if test="rental='used'">.30</xsl:if>
</xsl:variable>

<xsl:call-template name="showPrice">
     <xsl:with-param name="rent">
          <xsl:value-of select="$rate"/>
     </xsl:with-param>
</xsl:call-template>