web-dev-qa-db-ja.com

xsl:chooseを使用してXSLT変数を動的に定義する

XSLTスプレッドシート内で、xmlノードの値に応じて1つの値または別の値でxsl:variableを定義する必要があります。すぐ下のコードは、私がやろうとしていることを示しています。このように複数の変数を定義したいと思います。

主な問題は、各アイテムのノード値に基づいて変数値を選択するには、選択を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>

PDATE:わかりました。 Dark Falconが提供する以下の解決策を試しましたが、「タグの開始と終了の不一致」というエラーが表示され続けます。以前と同じエラー。 xsl:chooseをどこに置くかは気に入らないようです。これらの行番号は、エラーの原因であるためです。関連するすべてのスタイルシートコードは次のとおりです。

<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>
12
Alan

私はあなたの最初のコードの唯一の間違いは基本的に次のことだと思います:

<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)">
14
Lucero

とった。これが最終的に機能するコードです。解決策は、「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>
3
Alan

これを試して:

<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>
0
cesar

これは最善の方法ではないかもしれませんが:

価格をテンプレートに表示するためのロジックを考慮してから、を使用することをお勧めします。

<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>
0
Dark Falcon