Таблица XML в HTML с XSLT с динамическими заголовками - PullRequest
0 голосов
/ 21 ноября 2011

Мой вопрос немного похож на таблицу XML в HTML с XSLT .

У меня есть словарь, определенный в XML следующим образом:

<dictionary>
    <languages>
        <language>en</language>
        <language>ja</language>
    </languages>
    <entries>
        <entry id="1">
            <en>Test</en>
            <ja>テスト</ja>
        </entry>
        <entry id="2">
            <en>Test2</en>
            <ja>テスト2</en>
        </entry>
    </entries>
</dictionary>

И яхотел бы следующий вывод в XHTML:

<table>
    <thead>
        <tr>
            <th>en</th>
            <th>ja</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Test</td>
            <td>テスト</td>
        </tr>
        <tr>
            <td>Test2</td>
            <td>テスト2</td>
        </tr>
    </tbody>
</table>

Я адаптировал ответ из XML в таблицу HTML с XSLT следующим образом:

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

 <xsl:template match="//dictionary/entries">
     <table><xsl:apply-templates select="entry"/></table>
 </xsl:template>

 <xsl:template match="entry[1]">
  <thead><tr><xsl:apply-templates select="*" mode="header"/></tr></thead>
  <xsl:call-template name="standardRow"/>
 </xsl:template>

 <xsl:template match="entry" name="standardRow">
  <tbody><tr><xsl:apply-templates select="*"/></tr></tbody>
 </xsl:template>

 <xsl:template match="entry/*">
  <td><xsl:apply-templates select="node()"/></td>
 </xsl:template>

 <xsl:template match="entry/*" mode="header">
  <th><xsl:value-of select="name()"/></th>
 </xsl:template>
</xsl:stylesheet>

Дело в том, чтоЯ мог бы иметь следующие данные:

<dictionary>
    <languages>
        <language>en</language>
        <language>ja</language>
            <language>id</language>
    </languages>
    <entries>
        <entry id="1">
            <en>Test</en>
            <ja>テスト</ja>
        </entry>
        <entry id="2">
            <ja>テスト2</ja>
            <en>Test2</en>
            <id>uji2</id>
        </entry>
    </entries>
</dictionary>

Как вы, возможно, поняли, XSLT берет первый entry узел, чтобы определить имена столбцов, а столбец id не генерируется.Более того, если языковой порядок изменяется в entry, <td> не отображаются в порядке.

С введенным выше вводом я хотел бы следующий вывод:

<table>
    <thead>
        <tr>
            <th>en</th>
            <th>ja</th>
            <th>id</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Test</td>
            <td>テスト</td>
            <td></td>
        </tr>
        <tr>
            <td>Test2</td>
            <td>テスト2</td>
            <td>Uji2</td>
        </tr>
    </tbody>
</table>

ThisЯ впервые использую XSLT, и я не знаю, как мне это сделать.Я думаю, я мог бы использовать languages узел.Обратите внимание, что формат ввода XML гибкий, и я буду рад любым предложениям, даже если мне нужно изменить формат.

1 Ответ

1 голос
/ 21 ноября 2011

Вот пример таблицы стилей:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="html" indent="yes"/>

  <xsl:key name="k1" match="entry/*" use="concat(generate-id(..), '|', local-name())"/>

  <xsl:variable name="languages" select="/dictionary/languages/language"/>

  <xsl:template match="dictionary">
    <xsl:apply-templates select="entries"/>
  </xsl:template>

  <xsl:template match="entries">
    <table>
      <thead>
        <tr>
          <xsl:apply-templates select="$languages" mode="header"/>
        </tr>
      </thead>
      <tbody>
        <xsl:apply-templates/>
      </tbody>
    </table>
  </xsl:template>

  <xsl:template match="language" mode="header">
    <th>
      <xsl:value-of select="."/>
    </th>
  </xsl:template>

  <xsl:template match="entry">
    <tr>
      <xsl:apply-templates select="$languages">
        <xsl:with-param name="entry" select="current()"/>
      </xsl:apply-templates>
    </tr>
  </xsl:template>

  <xsl:template match="language">
    <xsl:param name="entry"/>
    <td>
      <xsl:value-of select="key('k1', concat(generate-id($entry), '|', .))"/>      
    </td>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...