这是我的XSLT:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<graph>
<categories>
<category>
<xsl:attribute name="name">
<xsl:value-of select="Rows/row/@Date" />
</xsl:attribute>
</category>
</categories>
<dataset>
<xsl:attribute name="seriesName">
<xsl:value-of select="Rows/row/@Actual_Amount"/>
</xsl:attribute>
</dataset>
<dataset>
<xsl:attribute name="seriesName">
<xsl:value-of select="Rows/row/@Threshold"/>
</xsl:attribute>
</dataset>
<dataset>
<xsl:attribute name="seriesName">
<xsl:value-of select="Rows/row/@Forecast_Amount"/>
</xsl:attribute>
</dataset>
</graph>
</xsl:template>
这是我的结果:
<graph>
<categories>
<category name="2014-01-01"/>
</categories>
<dataset seriesName="1800.0000"/>
<dataset seriesName="500.0000"/>
<dataset seriesName="2800.0000"/>
</graph>
任何人都可以告诉我为什么我只得到我的许多XML的第一个数据?
我也尝试过<xsl:value-of select="."/>
但是只生成了我的第一个数据。请帮忙。
答案 0 :(得分:0)
我猜你的XML看起来像这样:
<Rows>
<row Date="2014-01-01" Actual_Amount="1800.0000" Threshold="500.0000" Forecast_Amount="2800.0000" />
<row Date="2014-01-02" Actual_Amount="1850.0000" Threshold="550.0000" Forecast_Amount="2850.0000" />
</Rows>
您只获取第一个数据,因为您首先匹配&#34;文档节点&#34;
<xsl:template match="/">
这只会调用一次,因此模板中的所有代码只输出一次。此外,你在哪里这样做
<xsl:value-of select="Rows/row/@Date" />
value-of 语句只返回它找到匹配的第一个节点的值,而不管它有多少行。
您可能希望将第一个模板更改为此
<xsl:template match="/">
<xsl:apply-templates select="Rows/row" />
</xsl:template>
然后更改现有模板以匹配行而不是......
<xsl:template match="row">
<graph>
...
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="Rows/row" />
</xsl:template>
<xsl:template match="row">
<graph>
<categories>
<category name="{@Date}" />
</categories>
<dataset seriesName="{@Actual_Amount}"/>
<dataset seriesName="{@Threshold}"/>
<dataset seriesName="{@Forecast_Amount}"/>
</graph>
</xsl:template>
</xsl:stylesheet>
请注意在输出名称和 seriesName 属性时使用属性值模板。花括号{ }
表示要计算的表达式,而不是字面输出。
另请注意,在匹配行的模板中,xpath表达式将相对于您匹配的当前行节点,因此您只需执行{{1例如,而不是@Date
如果这不是您想要的输出,请编辑您的问题以显示您的实际期望,但希望这可以指出您正确的方向。