Получение всех данных из xml через xslt

#xml #xslt

#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. Пожалуйста, покажите ваш входной XML.

2. И ваш ожидаемый результат. Вы ожидаете несколько graph элементов?

3. Привет!! Спасибо, что ответили мне…

Ответ №1:

Я предполагаю, что ваш 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>
  

Вы получаете только первые данные, потому что начинаете с сопоставления «узла документа»

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

Обратите внимание на использование шаблонов значений атрибутов при выводе атрибутов name и SeriesName. Фигурные скобки { } указывают на выражение, которое должно быть вычислено, а не выведено буквально.

Также обратите внимание, что в шаблоне, который соответствует строке, выражения xpath будут относиться к текущему узлу строки, который вы сопоставляете, поэтому вам нужно только выполнить @Date , например, и не Rowsrow@Date

Если это не совсем тот результат, который вы хотите, пожалуйста, отредактируйте свой вопрос, чтобы показать, чего вы на самом деле ожидаете, но, надеюсь, это должно указать вам правильное направление.