как добавить HTML-таблицу данных по столбцам в xslt

#html #xml #xslt

#HTML #xml #xslt

Вопрос:

Таблица называется school. в ней есть два столбца, которые называются students и teachers . Я хочу добавить имена преподавателей и студентов в соответствующий столбец. это мой xml

 <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="school.xsl"?>
<school>
    <students>
        <student>
            <name>Lakshman</name>
        </student>
        <student>
            <name>Tharindu</name>
        </student>
    </students>
    <teachers>
        <teacher>
            <name>Sarath</name>
        </teacher>
        <teacher>
            <name>Hemantha</name>
        </teacher>
        <teacher>
            <name>Upali</name>
        </teacher>
    </teachers>
</school>
  

это мой файл xsl, на который ссылается xml-файл

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h2>School</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Students</th>
                        <th>Teachers</th>
                    </tr>
                    <td>
                       <xsl:for-each select="school/students/student">
                           <tr><td><xsl:value-of select="name"/></td></tr>
                       </xsl:for-each>
                    </td>
                    <td>
                        <xsl:for-each select="school/teachers/teacher">
                            <tr><td><xsl:value-of select="name"/></td></tr>
                        </xsl:for-each>
                    </td>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
  

но она выводит таблицу следующим образом.

введите описание изображения здесь

можно ли как-нибудь добавить имена студентов и преподавателей в их соответствующую колонку?

Ответ №1:

Используйте

 <xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:variable name="students" select="school/students/student"/>
    <xsl:variable name="teachers" select="school/teachers/teacher"/>

    <xsl:template match="/">

        <html>
            <body>
                <h2>School</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Students</th>
                        <th>Teachers</th>
                    </tr>
                    <xsl:apply-templates select="$students"/>
                    <xsl:variable name="stud-count" select="count($students)"/>
                    <xsl:apply-templates select="$teachers[position() > $stud-count]"/>
                </table>

            </body>
        </html>
    </xsl:template>

    <xsl:template match="student">
      <xsl:variable name="pos" select="position()"/>
      <tr>
        <td><xsl:value-of select="name"/></td>
        <td><xsl:value-of select="$teachers[$pos]/name"/></td>
      </tr>
   </xsl:template>

   <xsl:template match="teacher">
     <tr>
       <td>amp;#160;</td>
       <td>
         <xsl:value-of select="name"/>
       </td>
     </tr>
  </xsl:template>
</xsl:stylesheet>
  

Комментарии:

1. отлично, что это сработало. Спасибо. но прежде чем это заработает, вы должны добавить последние два тега шаблона внутри тега stylesheet. вы добавляете их вне тега таблицы стилей

2. было бы здорово, если бы вы могли предоставить объяснение своего ответа.

3. @lakshman, извините за неуместный конечный тег. Что касается того, как это работает, код сохраняет teacher элементы в глобальной переменной, чтобы иметь доступ к ней в другом месте таблицы стилей, обрабатывает все student существующие элементы для создания tr строки таблицы, заполненной name именами каждого ученика и name каждого преподавателя в одной и той же позиции (например, строка name первого ученика и name первого преподавателя ). In case there are more teachers than student the code processes those teachers as well, mapping each to a tr`, заполненная пустой ячейкой в первом столбце и именем во втором.