У меня есть пример XML, ниже,XSLT Динамические Столбцы в XML
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Row>
<Group>Group A</Group>
<Date>2013-09-02</Date>
<Value>200</Value>
</Row>
<Row>
<Group>Group A</Group>
<Date>2013-09-02</Date>
<Value>500</Value>
</Row>
<Row>
<Group>Group A</Group>
<Date>2013-10-02</Date>
<Value>400</Value>
</Row>
<Row>
<Group>Group B</Group>
<Date>2013-09-02</Date>
<Value>250</Value>
</Row>
</Root>
У меня есть XSLT (версия 1.0), который будет использоваться для обобщения данных, с помощью динамических столбцов. У меня есть код, создающий таблицу HTML, и результаты показывают правильное количество столбцов и правильное количество строк, я не могу получить ячейки в основной части таблицы, чтобы суммировать значения в узле «Значение» XML выше ,
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lookup="http://any.com/lookup" exclude-result-prefixes="lookup">
<xsl:output method="html" indent="yes" encoding="UTF-8" />
<xsl:decimal-format name="NN" NaN="-" />
<lookup:Dates>
<Date value="2013-09-02" />
<Date value="2013-10-02" />
<Date value="2013-11-04" />
<Date value="2013-12-02" />
<Date value="2014-01-02" />
<Date value="2014-02-03" />
<Date value="2014-03-03" />
</lookup:Dates>
<xsl:key name="Dates" match="/xsl:stylesheet/lookup:Dates" use="Date" />
<xsl:key name="Group" match="Row" use="Group" />
<xsl:template match="/">
<html>
<head>
<style type="text/css">
table {border:1px solid #000;border-collapse:collapse}
td {border:1px solid #000;border-collapse:collapse}
</style>
</head>
<body>
<table cellpadding="4" cellspacing="0">
<tr>
<td>Group</td>
<xsl:for-each select="document('')/*/lookup:Dates/Date">
<td>
<xsl:value-of select="@value" />
</td>
</xsl:for-each>
</tr>
<xsl:for-each select="/Root/Row[count(. | key('Group', Group)[1])=1]">
<xsl:sort select="Group" data-type="text" order="ascending" />
<xsl:variable name="curGroup" select="key('Group', Group)" />
<tr>
<td>
<xsl:value-of select="$curGroup/Group" />
</td>
<xsl:for-each select="document('')/*/lookup:Dates/Date">
<td>
<xsl:value-of select="sum($curGroup[/Root/Row/Date=current()/Dates/Date]/Value)" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Результирующий HTML является:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
table {border:1px solid #000;border-collapse:collapse}
td {border:1px solid #000;border-collapse:collapse}
</style>
</head>
<body><table cellpadding="4" cellspacing="0">
<tr>
<td>Group</td>
<td>2013-09-02</td>
<td>2013-10-02</td>
<td>2013-11-04</td>
<td>2013-12-02</td>
<td>2014-01-02</td>
<td>2014-02-03</td>
<td>2014-03-03</td>
</tr>
<tr>
<td>Group A</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Group B</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</table></body>
</html>
Любые идеи, где я неправильно? Я полагаю, что в XPath в строке
<xsl:value-of select="sum($curGroup[/Root/Row/Date=current()/Dates/Date]/Value)" />
Большое спасибо
Graham
Я не уверен, что понял ваш вопрос. Вы говорите «динамические столбцы», но ваши имена столбцов жестко закодированы в таблице стилей. Динамическое решение будет чисто управляемым данными. –
Решенный! XPath неверен в заявлении суммы, скорректированный на: теперь дает мне правильное резюме для групп и итоговых –
GrahamCFNewc
дат в подстановках: узле даты будет обновляться динамически, когда XSL загружен до того, как XML преобразуется – GrahamCFNewc