2013-09-11 2 views
2

Мне нужно получить значение, которое исходит от двух разных узлов в одном файле XML. Например, мой xml:Умножить значения узлов с помощью XSLT

<asset> 
     <curr_wanted>EUR</curr_wanted> 
     <curr>USD</curr> 
     <value>50</value> 
    </asset> 

    <exchangeRates> 
     <USD> 
     <USD>1</USD> 
     <EUR>0.73</EUR> 
     </USD> 
    </exchangeRates> 

и я хочу получить эквивалент 50 долларов в евро.

Я пробовал:

<xsl:value-of select="(Asset/value * /exchangeRates[node() = curr]/curr_wanted)"/> 

Но это не сработало. Также мне нужно использовать XSLT 1.0. Как я могу получить это значение в евро?

ответ

4

Я не проверял это очень много, но для ввода данных, например

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <asset> 
     <curr_wanted>EUR</curr_wanted> 
     <curr>USD</curr> 
     <value>50</value> 
    </asset> 
    <asset> 
     <curr_wanted>EUR</curr_wanted> 
     <curr>USD</curr> 
     <value>25</value> 
    </asset>  
    <exchangeRates> 
     <USD> 
     <USD>1</USD> 
     <EUR>0.73</EUR> 
     </USD> 
    </exchangeRates> 
</root> 

что-то вроде следующего может работать

for $asset in /root/asset, $rate in /root/exchangeRates 
    return $asset/value*$rate/*[name() = $asset/curr]/*[name() = $asset/curr_wanted] 

Но это будет работать только в XPath 2.0, и это также зависит от целого ввода xml (например, если может существовать больше элементов активов, больше элементов exchangeRates и т. д.).

Редактировать: В xslt 1.0 вы можете использовать переменную xsl: для хранения некоторой информации и предотвращения ее изменения в контексте при оценке xpath. Обратите внимание, например, на следующий шаблон:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output method="text" /> 

    <!-- Store "exchangeRates" in a global variable--> 
    <xsl:variable name="rates" select="/root/exchangeRates" /> 

    <xsl:template match="/root"> 
     <xsl:apply-templates select="asset" /> 
    </xsl:template> 

    <xsl:template match="asset"> 
     <!-- Store necessary values into local variables --> 
     <xsl:variable name="currentValue" select="value" /> 
     <xsl:variable name="currentCurrency" select="curr" /> 
     <xsl:variable name="wantedCurrency" select="curr_wanted" /> 
     <xsl:variable name="rate" select="$rates/*[name() = $currentCurrency]/*[name() = $wantedCurrency]" /> 

     <!-- Some text to visualize results --> 
     <xsl:value-of select="$currentValue" /> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="$currentCurrency" /> 
     <xsl:text> = </xsl:text> 

     <!-- using variable to prevent context changes during xpath evaluation --> 
     <xsl:value-of select="$currentValue * $rate" /> 

     <!-- Some text to visualize results --> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="$wantedCurrency" /> 

     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

который производит следующие выходные данные для ввода xml выше.

50 USD = 36.5 EUR 
25 USD = 18.25 EUR 
+0

, но я должен использовать XSLT 1.0, извините я забыл упомянуть об этом –

+0

я добавил XSLT 1.0 решение на мой ответ - посмотрите на него. –

Смежные вопросы