Динамический цикл XSLT через переменные столбца - PullRequest
1 голос
/ 04 января 2012

Я хотел бы динамически перебрать приведенный ниже XML, чтобы создать следующую структуру таблицы:

Дата |Время |Год01/04 |11:25:50 |201201/01 |1:05:20 |2012

Структура XML разбивает столбцы и строки, поэтому мне нужно передать атрибуты описания столбцов и использовать их для разделения атрибутов строк.

XML:

<Rowsets>
 <Rowset>
    <Columns>
        <Column Description="Date"/>
        <Column Description="Time"/>
        <Column Description="Year"/>
    </Columns>
    <Row>
        <Date>01/04</Date>
        <Time>11:25:50</Time>
        <Year>2012</Year>
    </Row>
    <Row>
        <Date>01/01</Date>
        <Time>1:05:20</Time>
        <Year>2012</Year>
    </Row>
 </Rowset>
</Rowsets>

Моя попытка XSLT , которая создает заголовки, но объединяет данные строки в один столбец:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 <html>  
  <body>
    <table border="1" cellspacing="0">
      <!-- Generate the row of table header cells -->
      <tr>
    <xsl:variable name="currentvar" select="//@Description[1]"/>
        <xsl:for-each select="$currentvar">
          <th>
            <xsl:value-of select="."/>
          </th>
        </xsl:for-each>
      </tr>
  <xsl:for-each select="Rowsets/Rowset/Row">
   <tr>
    <td>
              <xsl:value-of select="."/>
    </td>
       </tr>
      </xsl:for-each>       
  </table> 
  </body>
 </html>
</xsl:template>
</xsl:stylesheet>

Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

1 голос
/ 04 января 2012

Вашу таблицу стилей можно значительно упростить, разбив каждый раздел таблицы на собственный шаблон. Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <html>
            <body>
                <table border="1" cellspacing="0">
                    <xsl:apply-templates/>
                </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="Columns|Row">
        <tr><xsl:apply-templates/></tr>
    </xsl:template>
    <xsl:template match="Columns/*">
        <th><xsl:apply-templates select="@Description"/></th>
    </xsl:template>
    <xsl:template match="Row/*">
        <td><xsl:apply-templates/></td>
    </xsl:template>
</xsl:stylesheet>

Дает желаемый результат:

<html>
   <body>
      <table border="1" cellspacing="0">
         <tr>
            <th>Date</th>
            <th>Time</th>
            <th>Year</th>
         </tr>
         <tr>
            <td>01/04</td>
            <td>11:25:50</td>
            <td>2012</td>
         </tr>
         <tr>
            <td>01/01</td>
            <td>1:05:20</td>
            <td>2012</td>
         </tr>
      </table>
   </body>
</html>

Объяснение: Обратите внимание, что мы позволяем процессору XSLT выполнять большую часть работы. Мы просто применяем шаблоны на каждом уровне документа, который перемещает обработку по дочерним узлам контекста. (Нет необходимости явно зацикливать какие-либо элементы или выводить какой-либо текст из-за встроенных шаблонов XSLT .) Затем мы обрабатываем каждый раздел таблицы в своем собственном шаблоне. Это гораздо более гибкий, обслуживаемый и читаемый подход.

0 голосов
/ 04 января 2012

Это потому, что вы пытаетесь выделить все содержимое <Row> элементов.Замена

<td><xsl:value-of select="."/></td>

на

<td><xsl:value-of select="Date"/></td>
<td><xsl:value-of select="Time"/></td>
<td><xsl:value-of select="Year"/></td>

решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...