У вас проблема с этим шаблоном ....
<xsl:template match="//zz:convertTo/zz:from/zz:rate">
<xsl:for-each select="//zz:convertTo/zz:from/zz:rate">
<xsl:value-of select="zz:currency"/>
<xsl:value-of select="zz:mid"/>
</xsl:for-each>
</xsl:template>
Во-первых (и, строго говоря, в данном случае это не проблема), вам не нужен полный путь к zz:rate
указано.Вы можете просто сделать это ...
<xsl:template match="zz:rate">
Во-вторых (и это проблема) в шаблоне, вы делаете это ...
<xsl:for-each select="//zz:convertTo/zz:from/zz:rate">
Но когда вы начинаете выражение с//
это эффективно выбирает узлы в любом месте XML-документа независимо от текущего узла, который вы сопоставляете.По сути, вы говорите «для каждого zz: тарифа в документе, получите все zz: тарифы»
На самом деле вам не нужен xsl:for-each
вообще.Вы уже находитесь в шаблоне, соответствующем zz:rate
.Все, что вам нужно сделать, это выбрать элементы zz:rate
, которые вы хотите использовать в предыдущем шаблоне, что остановит вывод таких узлов, как terms
.
Попробуйте этот XSLT (обратите внимание, что отсутствует одно поле какЯ не был уверен, откуда берется «CurrencyRateType»
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:zz="http://xecdapi.xe.com" version="2.0" >
<xsl:template match="/">
<xsl:text>EffectiveTimestamp,FromCurrency,TargetCurrency,CurrencyRateType,CurrencyRate </xsl:text>
<xsl:apply-templates select="//zz:convertTo/zz:from/zz:rate" />
</xsl:template>
<xsl:template match="zz:rate">
<xsl:value-of select="substring(../../zz:timestamp, 1, 10)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="zz:currency"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="../../zz:to"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="zz:mid"/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
РЕДАКТИРОВАТЬ: На самом деле, если вы используете XSLT 2.0, вы можете сократить окончательный шаблон до этого ...
<xsl:template match="zz:rate">
<xsl:value-of select="substring(../../zz:timestamp, 1, 10), zz:currency, ../../zz:to, zz:mid" separator=","/>
<xsl:text> </xsl:text>
</xsl:template>