В рамках моей электронной таблицы 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>
Понятно. Вот код, который в итоге заработал. Решением было сочетание использования «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>
Возможно, это не лучший способ, но:
Я бы порекомендовал вам учесть вашу логику для отображения цены в шаблоне, а затем использовать
<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>
Я думаю, что единственное, что неправильно в вашем исходном коде, это следующее:
<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)">