Я разработал 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>