xslt для создания динамической таблицы с настраиваемыми заголовками - PullRequest
4 голосов
/ 14 декабря 2011

Я хотел бы преобразовать XML-документ, используя xslt с набором узлов строк и узлов столбцов, в таблицу xhtml.

Узлы столбца определяют данные о связанном атрибуте строки. Например, первый узел столбца указывает, что атрибут ID узла Row должен быть скрыт (т.е. не отображается в таблице). Элемент Caption узла Column определяет, каким должен быть текст заголовка столбца.

Я видел решения, в которых вы знаете заранее, какие атрибуты вы хотите превратить в столбцы, но я не уверен, как использовать соответствующие данные столбцов для форматирования заголовков

Введите:

<TableData>
    <Columns>
         <Column Name="ID" Hidden="true" />
         <Column Name="Name" Caption="Item Name" />
         <Column Name="Desc" Caption="Item Description" />
    </Columns>
    <Rows>
         <Row ID="0" Name="A" />
         <Row ID="1" Name="B" Desc="Some description"/>
         <Row ID="3" Name="C" />
    </Rows>
</TableData>

Желаемым выводом будет таблица в (x) html что-то вроде этого:

Item Name      | Item Description
--------------------------------------
A              |      
B              | Some Description
C              |

1 Ответ

3 голосов
/ 14 декабря 2011

Это преобразование :

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

 <xsl:key name="RowAttribsByName" match="Row/@*"
      use="concat(generate-id(..), '|', name())"/>

 <xsl:variable name="vColNames" select=
  "/*/Columns/*[not(@Hidden = 'true')]/@Name"/>

 <xsl:template match="/*">
  <table border="1">
    <tr>
     <xsl:apply-templates select="Columns/*"/>
    </tr>
    <xsl:apply-templates select="Rows/Row"/>
  </table>
 </xsl:template>

 <xsl:template match="Column[not(@Hidden = 'true')]">
  <td><xsl:value-of select="@Caption"/></td>
 </xsl:template>

 <xsl:template match="Row">
  <tr>
   <xsl:apply-templates select="$vColNames">
     <xsl:with-param name="pRowId"
          select="generate-id()"/>
   </xsl:apply-templates>
  </tr>
 </xsl:template>

 <xsl:template match="Column/@*">
  <xsl:param name="pRowId"/>

  <td width="50%">
    <xsl:value-of select=
      "key('RowAttribsByName',
           concat($pRowId, '|', .)
           )
    "/>
  </td>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<TableData>
    <Columns>
        <Column Name="ID" Hidden="true" />
        <Column Name="Name" Caption="Item Name" />
        <Column Name="Desc" Caption="Item Description" />
    </Columns>
    <Rows>
        <Row ID="0" Name="A" />
        <Row ID="1" Name="B" Desc="Some description"/>
        <Row ID="3" Name="C" />
    </Rows>
</TableData>

создает искомое, правильный результат :

<table border="1">
   <tr>
      <td>Item Name</td>
      <td>Item Description</td>
   </tr>
   <tr>
      <td width="50%">A</td>
      <td width="50%"/>
   </tr>
   <tr>
      <td width="50%">B</td>
      <td width="50%">Some description</td>
   </tr>
   <tr>
      <td width="50%">C</td>
      <td width="50%"/>
   </tr>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...