xslt: Как я могу создать динамическую таблицу? - PullRequest
1 голос
/ 17 апреля 2009

Учитывая это xml

<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

Ответы [ 3 ]

3 голосов
/ 17 апреля 2009
<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>
2 голосов
/ 17 апреля 2009

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

<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> .

1 голос
/ 17 апреля 2009

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

<?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>

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...