Мое решение для XSLT 1.0 и работает под управлением Altova XMLSpy. Следующий шаблон:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Results</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Dogs</th>
<th>Horses</th>
</tr>
<xsl:apply-templates select="document">
<xsl:with-param name="num" select="1" />
</xsl:apply-templates>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="document">
<xsl:param name="num" />
<xsl:if test="count(animal/fact[$num]) = count(animal)">
<tr>
<xsl:for-each select="animal">
<td><xsl:value-of select="fact[$num]"/></td>
</xsl:for-each>
</tr>
<xsl:apply-templates select=".">
<xsl:with-param name="num" select="$num + 1"/>
</xsl:apply-templates>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
, примененный к предоставленному входному XML, дает следующий результат:
<html>
<body>
<h2>Results</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Dogs</th>
<th>Horses</th>
</tr>
<tr>
<td>4 legs</td>
<td>rideable</td>
</tr>
<tr>
<td>2 eyes</td>
<td>4 legs</td>
</tr>
<tr>
<td>loyal</td>
<td>2 eyes</td>
</tr>
</table>
</body>
</html>
Я предположил, что вас не интересует генерация строк, в которых будет заполнена только одна ячейка (последняя строка, которая будет иметь только значение huge
в столбце Horse
, не должна приниматься во внимание). Это отличается от решения Дэвида.
РЕДАКТИРОВАТЬ: Однако, действительно просто изменить мой подход, чтобы получить те же результаты, что и Дэвид Требуется только изменить условие при вызове функции count()
XPATH:
<xsl:if test="count(animal/fact[$num]) > 0">
вместо:
<xsl:if test="count(animal/fact[$num]) = count(animal)">
Сделав это, вы получите следующий вывод:
<html>
<body>
<h2>Results</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Dogs</th>
<th>Horses</th>
</tr>
<tr>
<td>4 legs</td>
<td>rideable</td>
</tr>
<tr>
<td>2 eyes</td>
<td>4 legs</td>
</tr>
<tr>
<td>loyal</td>
<td>2 eyes</td>
</tr>
<tr>
<td></td>
<td>huge</td>
</tr>
</table>
</body>
</html>