XSLT и столбцы динамической таблицы - PullRequest
1 голос
/ 24 августа 2010

Я разработал XSL-файл, который преобразует XML-файлы в HTML-таблицу.Идея состоит в том, чтобы только один xsl-файл преобразовывал множество xml-файлов в html-таблицу вместо 10 xml-файлов с 10 сопровождающими xsl-файлами.Я включил один xsl-файл и 2 xml-файла, которые используют xsl-файл для преобразования их в html-таблицы.У меня проблема в том, что я не могу понять, как создаются столбцы для строк, чтобы завершить сгенерированную таблицу.Пожалуйста, проверьте код ниже, чтобы получить понимание.Любая поддержка приветствуется.Спасибо!

тон

XSL-файл: test_xsl.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>

<xsl:template match="/root/sheet">
    <html>
        <head></head>
        <body>
            <table border="1" width="100%" cellpadding="0" cellspacing="0" height="100%">

                <xsl:apply-templates select="headers"/>

                <xsl:for-each select="rows">
                    <xsl:for-each select="item">
                        <tr>
                            <td>
                                <table border="1" width="100%" height="100%" cellpadding="0" cellspacing="0">
                                    <tr>
                                        <td>
                                            <b><xsl:value-of select="name" disable-output-escaping="yes" /></b>
                                        </td>

                                    </tr>
                                </table>
                            </td>
                        </tr>
                    </xsl:for-each>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>
<xsl:template match="headers">
    <tr>
        <xsl:apply-templates select="item"/>
    </tr>
</xsl:template>
<xsl:template match="headers//item">
    <th>
        <xsl:choose>
            <xsl:when test="item">
                <table border="1" width="100%" height="100%">
                    <tr><td colspan="{count(item)}"><xsl:value-of select="name"/></td></tr>
                    <xsl:apply-templates select="item"/>
                </table>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="name"/>
            </xsl:otherwise>
        </xsl:choose>
    </th>
</xsl:template>
</xsl:stylesheet>

XML-файл 1: test_xml1.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test_xsl.xsl"?>

<root>
    <sheet>
        <titles>
            <item>
                <name><![CDATA[Title 1]]></name>
            </item>
            <item>
                <name><![CDATA[Title 2]]></name>
            </item>
            <item>
                <name><![CDATA[Title 3]]></name>
            </item>
        </titles>
        <headers>
            <item>
                <name><![CDATA[Header 1]]></name>
            </item>
            <item>
                <name><![CDATA[Header 2]]></name>
                <item>
                    <name><![CDATA[Sub header 1 of Header 2]]></name>
                </item>
                <item>
                    <name><![CDATA[Sub header 2 of Header 2]]></name>
                    <item>
                        <name><![CDATA[Sub header 1 of Sub header 2 of Header 2]]></name>
                    </item>
                    <item>
                        <name><![CDATA[Sub header 2 of Sub header 2 of Header 2]]></name>
                    </item>
                </item>
            </item>
            <item>
                <name><![CDATA[Header 3]]></name>
            </item>
        </headers>
        <rows>
            <item>
                <name><![CDATA[Row 1]]></name>
            </item>
            <item>
                <name><![CDATA[Row 2]]></name>
            </item>
            <item>
                <name><![CDATA[Row 3]]></name>
            </item>
            <item>
                <name><![CDATA[Row 4]]></name>
            </item>
        </rows>
    </sheet>
</root>

XML-файл 2:test_xml2.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test_xsl.xsl"?>
<root>
<sheet>
  <titles>
   <item>
    <name><![CDATA[Title 1]]></name>
   </item>

   <item>
    <name><![CDATA[Title 2]]></name>
   </item>

   <item>
    <name><![CDATA[Title 3]]></name>
   </item>
  </titles>
  <headers>
    <item>
    <name><![CDATA[Header 1]]></name>
   </item>

   <item>
    <name><![CDATA[Header 2]]></name>
   </item>

   <item>
    <name><![CDATA[Header 3]]></name>
   </item>
   <item>
    <name><![CDATA[Header 4]]></name>

    <item>
     <name><![CDATA[Sub header 1 of Header 4]]></name>
    </item>

    <item>
     <name><![CDATA[Sub header 2 of Header 4]]></name>
    </item>
   </item>
  </headers>

  <rows>
   <item>
    <name><![CDATA[Row 1]]></name>
   </item>
   <item>
    <name><![CDATA[Row 2]]></name>
   </item>                           

   <item>
    <name><![CDATA[Row 3]]></name>
   </item>                           

   <item>
    <name><![CDATA[Row 4]]></name>
   </item>   


  </rows>
 </sheet>
</root>

ОБНОВЛЕНИЕ

Вот xsl-файл, который отформатирует предоставленный мной файл test_xml1.xml.Пытаясь использовать этот xsl-файл с файлом test_xml2.xml, вы заметите, что в таблице отсутствует столбец.Причина этого в том, что это жестко закодировано.В идеале это должно быть динамичным.Надеюсь, мне было ясно.Спасибо за вашу помощь!

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>

<xsl:template match="/root/sheet">
    <html>
        <head></head>
        <body>
            <table border="1" width="100%" cellpadding="0" cellspacing="0" height="100%">
                <xsl:apply-templates select="headers"/>
                <xsl:for-each select="rows">
                    <xsl:for-each select="item">
                        <tr>
                            <td>
                                <table border="1" width="100%" height="100%" cellpadding="0" cellspacing="0">
                                    <tr>
                                        <td>
                                            <b><xsl:value-of select="name" disable-output-escaping="yes" /></b>
                                        </td>

                                    </tr>
                                </table>
                            </td>
                            <td><br /></td>
                            <td><br /></td>
                        </tr>
                    </xsl:for-each>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>
<xsl:template match="headers">
    <tr>
        <xsl:apply-templates select="item"/>
    </tr>
</xsl:template>
<xsl:template match="headers//item">
    <th>
        <xsl:choose>
            <xsl:when test="item">
                <table border="1" width="100%" height="100%">
                    <tr><td colspan="{count(item)}" width="40%"><xsl:value-of select="name"/></td></tr>
                    <xsl:apply-templates select="item"/>
                </table>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="name"/>
            </xsl:otherwise>
        </xsl:choose>
    </th>
</xsl:template>

1 Ответ

1 голос
/ 01 сентября 2010

Нет данных для столбцов и нет связи между заголовками и фактическими строками, но это даст правильное количество (пустых) ячеек ...

<xsl:template match="/root/sheet">
    <html>
      <head></head>
      <body>
        <table border="1" width="100%" cellpadding="0" cellspacing="0" height="100%">
          <xsl:apply-templates select="headers"/>
          <xsl:for-each select="rows">
            <xsl:for-each select="item">
              <tr>
                <td>
                  <xsl:value-of select="name" disable-output-escaping="yes" />
                </td>
                <!--
                <td>
                  <br />
                </td>
                <td>
                  <br />
                </td>-->
                <!-- Loop through all the first level headers except the first one -->
                <xsl:for-each select="//headers/item[position() &gt; 1]">
                  <td>
                    <br />
                  </td>
                </xsl:for-each>
              </tr>
            </xsl:for-each>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

По сути, вместо жесткого кодированияячейки, вы просто зацикливаете заголовки первого уровня, чтобы получить правильное количество ячеек.А в приведенном выше примере кода я пропускаю первую ячейку (position ()> 1), поскольку вы уже выводите ее.

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