Как извлечь дочерние элементы «для кэшированного» элемента только с помощью XSLT - PullRequest
1 голос
/ 11 ноября 2010

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

<reportStructure>
  <table>
    <headers>
      <tableHeader>Header 1.1</tableHeader>
      <tableHeader>Header 1.2</tableHeader>
    </headers>
    <tuples>
      <tuple>
        <tableCell>1.1.1</tableCell>
        <tableCell>1.2.1</tableCell>
      </tuple>
      <tuple>
        <tableCell>1.1.2</tableCell>
        <tableCell>1.2.2</tableCell>
      </tuple>
    </tuples>
  </table>
  <table>
  ...

Я использую XSLT и XPath для преобразования данных, но foreach не работает так, как я ожидаюto:

      <xsl:template match="reportStructure">
        <xsl:for-each select="table">
          <table>
            <tr>
              <xsl:apply-templates select="/reportStructure/table/headers"/>
            </tr>
            <xsl:apply-templates select="/reportStructure/table/tuples/tuple"/>
          </table>      
        </xsl:for-each>
      </xsl:template>

      <xsl:template match="headers">
        <xsl:for-each select="tableHeader">
          <th>
            <xsl:value-of select="." />
          </th>
        </xsl:for-each>
      </xsl:template

      <xsl:template match="tuple">
        <tr>
          <xsl:for-each select="tableCell">
            <td>
              <xsl:value-of select="." />
            </td>
          </xsl:for-each>
        </tr>
      </xsl:template>

Хотя я ожидаю, что это выведет одну таблицу на тег таблицы, она выведет все заголовки и ячейки таблицы для каждого тега таблицы.

Ответы [ 2 ]

6 голосов
/ 11 ноября 2010

Вы выбираете все заголовки и кортежи в своих apply-templates.

Выберите только соответствующие:

  <xsl:template match="reportStructure">
    <xsl:for-each select="table">
      <table>
        <tr>
          <xsl:apply-templates select="headers"/>
        </tr>
        <xsl:apply-templates select="tuples/tuple"/>
      </table>      
    </xsl:for-each>
  </xsl:template>

Вы также должны просто иметьвыше, как один table шаблон, без xsl:for-each:

  <xsl:template match="table">
      <table>
        <tr>
          <xsl:apply-templates select="headers"/>
        </tr>
        <xsl:apply-templates select="tuples/tuple"/>
      </table>      
  </xsl:template>
2 голосов
/ 11 ноября 2010

Помимо хорошего ответа @ Одеда, это показывает, почему «стиль нажатия» более ... многократно используется:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="table">
        <table>
            <xsl:apply-templates/>
        </table>
    </xsl:template>
    <xsl:template match="headers|tuple">
        <tr>
            <xsl:apply-templates/>
        </tr>
    </xsl:template>
    <xsl:template match="tableHeader">
        <th>
            <xsl:apply-templates/>
        </th>
    </xsl:template>
    <xsl:template match="tableCell">
        <td>
            <xsl:apply-templates/>
        </td>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...