从xml到xslt获取所有数据

时间:2014-06-21 15:07:40

标签: xml xslt

这是我的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="."/>但是只生成了我的第一个数据。请帮忙。

1 个答案:

答案 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

如果这不是您想要的输出,请编辑您的问题以显示您的实际期望,但希望这可以指出您正确的方向。