2009-04-17 10 views
1

Учитывая этот XMLxslt: Как создать динамическую таблицу?

<Documents> 
<Section> 
<SectionName>Green</SectionName> 
    <Document> 
    <FileName>Tier 1 Schedules</FileName>  
    </Document> 
    <Document> 
    <FileName>Tier 3 Schedules</FileName>  
    </Document> 
    <Document> 
    <FileName>Setback Schedule</FileName>  
    </Document> 
    <Document> 
    <FileName>Tier 2 Governance</FileName>  
    </Document> 
</Section> 
<Section> 
<SectionName>MRO/Refurb</SectionName> 
    <Document> 
    <FileName>Tier 2 Governance</FileName>  
    </Document> 
</Section> 
</Documents> 

Что бы XSLT быть выводить этот HTML

<table> 
    <tr> 
    <td>Green</td> 
    </tr> 
    <tr> 
    <td>Tier 1 Schedules</td> 
    </tr> 
    <tr> 
    <td>Tier 3 Schedules</td> 
    </tr> 
    <tr> 
    <td>Setback Schedule</td> 
    </tr> 
    <tr> 
    <td>Tier 2 Governance</td> 
    </tr> 
    <tr> 
    <td>MRO/Refurb</td> 
    </tr> 
    <tr> 
    <td>Tier 2 Governance</td> 
    </tr> 
</table> 

Я мог бы сделать это в asp.net, но не знаете, как сделать петли в XSLT.

Спасибо, Al

+0

Как показано на ответе marc_s, вы не зацикливаете на XSLT. Это декларативный язык. Забудьте о процедурных размышлениях. – bortzmeyer

+0

@bortzmeyer: Строго говоря, вы, конечно, делаете цикл в XSLT. :-) Просто вы выражаете другой подход. – Tomalak

+0

Что делать, если я хотел сделать несколько столбцов? – user69971

ответ

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

    <xsl:template match="/"> 
    <table> 
     <xsl:apply-templates select="//SectionName | //FileName" /> 
    </table> 
    </xsl:template> 

    <xsl:template match="SectionName | FileName"> 
    <tr> 
     <td><xsl:value-of select="." /></td> 
    </tr> 
    </xsl:template> 

</xsl:stylesheet> 
+0

+1 - darn - ваш ответ точным и даже более кратким (снова!) :-) –

1

Нечто подобное должно сделать трюк:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/"> 
     <table> 
     <xsl:copy> 
      <xsl:apply-templates /> 
     </xsl:copy> 
     </table> 
    </xsl:template> 

    <xsl:template match="SectionName"> 
    <tr> 
     <td> 
     <xsl:value-of select="."/> 
     </td> 
    </tr> 
    </xsl:template> 

    <xsl:template match="Document"> 
    <tr> 
     <td> 
     <xsl:value-of select="FileName"/> 
     </td> 
    </tr> 
    </xsl:template> 
</xsl:stylesheet> 

Марк

+0

Ничтожное замечание: Можете ли вы сказать, к чему вы включили элемент ?:) Возможно, ваши ожидания от этого эффекта ошибочны. – Tomalak

+0

О, извините - это остатки шаблона по умолчанию Visual Studio .... не должно быть. –

2

На самом деле, существует несколько более простое решение чем предложенному Томалак:

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

    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <table> 
      <xsl:apply-templates/> 
     </table> 
    </xsl:template> 

    <xsl:template match="SectionName | FileName"> 
     <tr> 
      <td> 
       <xsl:value-of select="." /> 
      </td> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется на первоначально предоставленному документу XML, разыскиваемый результат получается:

<table> 
    <tr> 
     <td>Green</td> 
    </tr> 
    <tr> 
     <td>Tier 1 Schedules</td> 
    </tr> 
    <tr> 
     <td>Tier 3 Schedules</td> 
    </tr> 
    <tr> 
     <td>Setback Schedule</td> 
    </tr> 
    <tr> 
     <td>Tier 2 Governance</td> 
    </tr> 
    <tr> 
     <td>MRO/Refurb</td> 
    </tr> 
    <tr> 
     <td>Tier 2 Governance</td> 
    </tr> 
</table> 

Обратите внимание:

  1. <xsl:apply-templates> инструкция не явно укажите нод-лист, который должен быть обработан. Здесь мы полагаемся на то, что единственными небезовыми пространствами в документе являются те, которые являются дочерними узлами, для которых у нас есть соответствующий шаблон.

  2. Для этого конкретного документа XML мы могли бы даже изменить шаблон спички <xsl:template match="SectionName | FileName"> просто: <xsl:template match="text()"> и преобразование будут по-прежнему производят желаемый результат.

  3. Использование директивы <xsl:strip-space>.

+0

Я думал, что явный выбор узлов, которые нужно применить к шаблонам, приведет к лучшей производительности. В вашем решении посещаются все узлы, а не только интересующие вас. Это правда или не имеет значения? Я не уверен, может быть, мое «// SectionName | // FileName» - это более мощный убийца производительности. – Tomalak

+1

@Tomalak Если XSLT-процессор не оптимизирован хорошо, выбирая узлы, указанные в: // //NNNAME // Имя_файла, может вызвать два полных сканирования всего XML-документа. Всегда полезно избегать аббревиатуры «//», если это возможно. –

+0

Я вижу. Предположим, что исходный документ содержит еще много узлов, чем хотелось бы для вывода. Как бы вы проигнорировали их? Пример: ? – Tomalak

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