#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
Если это не совсем тот результат, который вы хотите, пожалуйста, отредактируйте свой вопрос, чтобы показать, чего вы на самом деле ожидаете, но, надеюсь, это должно указать вам правильное направление.