2016-03-03 2 views
0

Я пытаюсь создать таблицу HTML из некоторого XML, который я получил через SQL-запрос. XML производится выглядит следующим образом:XML/XSLT вложенные петли атрибутов для создания таблицы HTML

<root> 
<form attribute1="1" attribute2="1" /> 
<form attribute1="1" attribute2="2" /> 
<form attribute1="1" attribute2="3" /> 
<form attribute1="2" attribute2="1" /> 
<form attribute1="2" attribute2="2" /> 
<form attribute1="3" attribute2="1" /> 
</root> 

таблицы Я пытаюсь произвести, должен иметь строку заголовка для каждого уникального attribute1 с рядами под ним для каждого attribute2, что-то вроде этого:

<attribute1="1" /> 
<attribute2="1" /> 
<attribute2="2" /> 
<attribute2="3" /> 

<attribute1="2" /> 
<attribute2="1" /> 
<attribute2="2" /> 

<attribute1="3" /> 
<attribute2="1" /> 

У меня нет большого опыта использования XML/XSLT, но я надеюсь, что можно будет сделать что-то вроде цикла через формы, создать строку заголовка для каждого уникального атрибута1, а затем создать строки данных, связанные с уникальным атрибутом1 под ним.

+0

Это проблема с группировкой. Если вы используете XSLT 1.0, вам нужно будет использовать метод Muenchian grouping. См. Http://www.jenitennison.com/xslt/grouping/muenchian.html для объяснения. В этом случае ваш ключ будет ''. Если вы используете XSLT 2.0, вы можете использовать 'xsl: for-each-group'. См. Http://www.xml.com/pub/a/2003/11/05/tr.html. –

+0

Привет @ Тим-С. Я уверен, что я использую 1.0, поэтому мне придется заглянуть в группу Muenchian. По моему мнению, это даст каждому из строк ключ в зависимости от атрибута1. Чтобы затем продолжить обработку, мне понадобится ключ < ', чтобы получить строки данных? –

+0

Я добавил ответ, чтобы показать, что Muenchian grouping в действии для вашего примера. –

ответ

0

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="form" match="form" use="@attribute1" /> 

    <xsl:template match="root"> 
    <xsl:copy> 
     <!-- Get first "form" element that occurs in each group --> 
     <xsl:for-each select="form[generate-id() = generate-id(key('form',@attribute1)[1])]"> 
      <group> 
      <header><xsl:value-of select="@attribute1" /></header> 
      <!-- Get the "form" elements that make up the group --> 
      <xsl:apply-templates select="key('form', @attribute1)" /> 
      </group> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="form"> 
    <row><xsl:value-of select="@attribute2" /></row> 
    </xsl:template> 
</xsl:stylesheet> 

А вот некоторые XSLT, которые могут создать таблицу HTML. Это немного более продвинутое, поскольку оно выдает максимальное количество столбцов для строки и использует это при создании атрибутов colspan для более коротких строк.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:key name="form" match="form" use="@attribute1" /> 

    <xsl:variable name="maxCells"> 
     <xsl:for-each select="/root/form[generate-id() = generate-id(key('form',@attribute1)[1])]"> 
      <xsl:sort select="count(key('form', @attribute1))" order="descending" /> 
      <xsl:if test="position() = 1"> 
       <xsl:value-of select="count(key('form', @attribute1))" /> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:variable> 

    <xsl:template match="root"> 
    <table border="1"> 
     <!-- Get first "form" element that occurs in each group --> 
     <xsl:for-each select="form[generate-id() = generate-id(key('form',@attribute1)[1])]"> 
      <tr> 
       <th colspan="{$maxCells}"> 
        <xsl:value-of select="@attribute1" /> 
       </th> 
      </tr> 
      <tr> 
      <!-- Get the "form" elements that make up the group --> 
       <xsl:apply-templates select="key('form', @attribute1)" /> 
      </tr> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 

    <xsl:template match="form"> 
    <td> 
     <xsl:if test="position() = last()"> 
      <xsl:attribute name="colspan"> 
       <xsl:value-of select="$maxCells - count(key('form', @attribute1)) + 1" /> 
      </xsl:attribute> 
     </xsl:if> 
     <xsl:value-of select="@attribute2" /> 
    </td> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Hi @TimC. Я не могу заставить это работать - ему нужно создать html стол в конце его. Я отредактирую свой OP с кодом, который я пробовал адаптировать от твоего. –

+0

@DavidAustin Я добавил образец к моему ответу, чтобы показать выводимую таблицу HTML. –

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