2011-12-14 2 views
4

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

Узлы столбцов определяют данные о соответствующем атрибуте строки. Например, первый узел столбца указывает, что атрибут 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    | 

ответ

3

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

<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> 
+0

очень хороший! отлично работает – cordialgerm

+0

Что делать, если в каждой колонке есть атрибут Sort, который я хотел бы отсортировать столбцы? Я могу посмотреть, где применить xsl: sort для шаблонов apply-templates для заголовков, но как я могу правильно отсортировать отдельные ячейки? – cordialgerm

+0

@pickles: что означал бы этот атрибут сортировки? Невозможно определить новый вопрос в комментариях - пожалуйста, подумайте об этом и задайте новый вопрос. Через 8 часов я буду спать и смогу ответить на ваш новый вопрос. Спокойной ночи. –

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