Динамическое определение переменных XSLT с помощью xsl: choose - PullRequest
11 голосов
/ 14 февраля 2010

В моей электронной таблице XSLT мне нужно определить переменную xsl: с одним или другим значением в зависимости от значения узла 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>

UPDATE: Хорошо. Я пробовал решение, предоставленное ниже 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 ]

13 голосов
/ 14 февраля 2010

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

<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)">
3 голосов
/ 15 февраля 2010

Понял. Вот код, который закончил работать. Решением было сочетание использования «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>
0 голосов
/ 08 августа 2015

Попробуйте это:

<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 голосов
/ 14 февраля 2010

Это может быть не лучшим способом, но:

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

<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>
...