[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: =?koi8-r?B?UmU6IFJlOiDUxdLNyc7Z?=



> From: "Serge Shikov" <shikov@rinet.ru>
> 
> P.S. Кстати, если XSL считать программой, кто бы мог просветить - как
> без написания скриптов сделать простую вещь: содержимое всех тэгов
> <price> умножить на некий коэффициент, скажем перевести в другую валюту
> (в соответствии с атрибутом currency="..." например, а само число взять
> скажем из другого XML-документа). Как со скриптами - это я знаю, это у
> MS для MSIE5 описано.
> 

Мой пример будет слегка кривой, потому что в XT, которым я пользуюсь
не реализована функция document(), позволяющая доступаться к другим
документам.


Пусть есть документ, содержащий цены и таблицу курсов:

<alldata>
  <!-- таблица цен -->
  <prices>
    <price item="Foo" value="12.00" currency="USD" />
    <price item="Bar" value="77.00" currency="RUB" />
  </prices>

  <!-- таблица курсов -->
  <rates>
    <rate name="USD" value="24.20" />
    <rate name="RUB" value= "1.00" />
  </rates>
</alldata>



Пишем следующее:

----------------------------------------------------------------------
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">

  <xsl:template match="/">
    <prices>
      <xsl:apply-templates/>
    </prices>
  </xsl:template>

  <xsl:template match="price">
    <xsl:variable name="curname" select="@currency" />
    <xsl:variable name="rate"
                  select="/alldata/rates/rate[@name=$curname]/@value" />
    <price item  = "{@item}"
             foo = "{@value * $rate}" />
  </xsl:template>

  <xsl:template match="rates">
  </xsl:template>

</xsl:stylesheet>
----------------------------------------------------------------------



Если бы работала функция document, можно было вместо
  /alldata/rates/rate
написать
  document('some URI')/rates/rate

Воот. И никаких скриптов!


--бо


-- 
bo berkhaut
http://www.syntext.com
--