Определение Переменных XSLT динамично с помощью xsl:choose

В рамках моей электронной таблицы XSLT я должен определить xsl:variable с одним значением или другим в зависимости от значения xml узла. Код чуть ниже шоу, что я пытаюсь сделать. Я хотел бы определить несколько переменных этот путь.

Главная проблема - то, что для выбора значения переменной на основе значения узла каждого объекта, выбор должен быть сделан в 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>

ОБНОВЛЕНИЕ: хорошо. Я попробовал решение, предоставленное ниже Темным Соколом, но это продолжает давать мне ошибку "Несоответствие Открывающих и Завершающих тэгов". Та же ошибка как прежде. Этому, кажется, не нравится иметь 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 14 February 2010 в 00:21
поделиться

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>
5
ответ дан 2 December 2019 в 18:53
поделиться

Возможно, это не лучший способ, но:

Я бы порекомендовал вам учесть вашу логику для отображения цены в шаблоне, а затем использовать

<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
ответ дан 2 December 2019 в 18:53
поделиться

Я думаю, что единственное, что неправильно в вашем исходном коде, это следующее:

<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
ответ дан 2 December 2019 в 18:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: