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

Ala*_*lan 12 xslt variables dynamic

在我的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}">
Run Code Online (Sandbox Code Playgroud)

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

    <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>
Run Code Online (Sandbox Code Playgroud)

更新: 好的.我已经尝试过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>
Run Code Online (Sandbox Code Playgroud)

Luc*_*ero 14

我认为你的初始代码唯一的问题基本上是:

<xsl:variable name="rent1" select="number($rate1)">
Run Code Online (Sandbox Code Playgroud)

(不,{}因为它是一个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)">
Run Code Online (Sandbox Code Playgroud)


Ala*_*lan 5

得到它了。这是最终起作用的代码。解决方案是使用“ 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>
Run Code Online (Sandbox Code Playgroud)


Dar*_*con 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>
Run Code Online (Sandbox Code Playgroud)