#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`, заполненная пустой ячейкой в первом столбце и именем во втором.