Похоже, вы ищете что-то вроде этого:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
xmlns:exr="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
exclude-result-prefixes="gesmes exr"
>
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:template match="gesmes:Envelope">
<xdoc>
<ccurency>
<xsl:apply-templates select="exr:Cube/exr:Cube/exr:Cube" />
</ccurency>
</xdoc>
</xsl:template>
<xsl:template match="exr:Cube[@currency and @rate]">
<row>
<Date>
<xsl:value-of select="../@time" />
</Date>
<Currency>
<xsl:value-of select="@currency" />
</Currency>
<Rate>
<xsl:value-of select="@rate" />
</Rate>
</row>
</xsl:template>
</xsl:stylesheet>
При применении к вашему входному XML он выдает:
<xdoc>
<ccurency>
<row>
<Date>2009-07-16</Date>
<Currency>PHP</Currency>
<Rate>67.739</Rate>
</row>
<row>
<Date>2009-07-16</Date>
<Currency>SGD</Currency>
<Rate>2.0501</Rate>
</row>
<row>
<Date>2009-07-16</Date>
<Currency>THB</Currency>
<Rate>48.13</Rate>
</row>
<row>
<Date>2009-07-16</Date>
<Currency>ZAR</Currency>
<Rate>11.4575</Rate>
</row>
</ccurency>
</xdoc>
Примечания:
- Не используйте
<xsl:for-each>
, когда это возможно. Это выглядит более знакомым и менее пугающим, чем <xsl:apply-templates>
, но в большинстве случаев это не лучший вариант.
- Вам не нужно создавать элементы с
<xsl:element>
, вы можете написать их напрямую.
- Вам не нужно хранить переменную с тем значением
@time
, которое вас интересует. Вы всегда можете обратиться к родительскому узлу и извлечь его оттуда напрямую (../@time
)
- Я использовал
exclude-result-prefixes
, чтобы пространства имен полностью исчезли из вывода, вы, кажется, хотите избавиться от них