2014-03-04 3 views
2

У меня есть пример 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

+0

Я не уверен, что понял ваш вопрос. Вы говорите «динамические столбцы», но ваши имена столбцов жестко закодированы в таблице стилей. Динамическое решение будет чисто управляемым данными. –

+0

Решенный! XPath неверен в заявлении суммы, скорректированный на: теперь дает мне правильное резюме для групп и итоговых – GrahamCFNewc

+0

дат в подстановках: узле даты будет обновляться динамически, когда XSL загружен до того, как XML преобразуется – GrahamCFNewc

ответ

0

Если вы хотите добавить общий итог строки, то делает это не будет работать ...

<xsl:for-each select="document('')/*/lookup:Dates/Date"> 
    <td class="right"> 
     <xsl:value-of select="sum(Root/Row[Date=current()/@value]/Value)" /> 
    </td> 
</xsl:for-each> 

Это происходит потому, что внутри XSL: для каждого- цикла вашего контекст является Датой элемента, так что делает g выражение xpath Root/Row будет относиться к этому.

Решение состоит в простом определении переменной (перед циклом), содержащей все элементы Row, а затем ссылается на это. Попробуйте следующее:

<xsl:variable name="allGroups" select="//Row" /> 
<xsl:for-each select="//Dates/Date"> 
    <td> 
     <xsl:value-of select="sum($allGroups[Date=current()/@value]/Value)" /> 
    </td> 
</xsl:for-each> 
+0

Замечательно! Большое спасибо. Прекрасно работает – GrahamCFNewc

Смежные вопросы