需要从 XML 属性创建 HTML table
Need to create the HTML table from XML Attribute
我有带属性值的输入 XML,需要使用 XSLT 创建 HTML Table。
输入XML:
<manuals>
<title>Test</title>
<results>
<auto name="Data">
<manual name="Blank">
<result column="Data"/>
</manual>
</auto>
<auto name="View">
<manual name="Blank2">
<result column="Information"/>
<result column="Test"/>
</manual>
<manual name="Value">
<result column="Exceptions"/>
</manual>
</auto>
</results>
</manuals>
预期 HTML:
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>XXX</title>
<style>
table,th, td{border: 1px solid black; padding: 5px;}
</style>
</head>
<body>
<table>
<caption>Test</caption>
<tr>
<td colspan="2" style="text-align:center">Data</td>
</tr>
<tr>
<td>Blank</td>
<td>Data</td>
</tr>
<tr>
<td colspan="2" style="text-align:center">View</td>
</tr>
<tr>
<td>Blank2</td>
<td>
<ul>
<li>Information</li>
<li>Test</li>
</ul>
</td>
</tr>
<tr>
<td>Value</td>
<td>Exceptions</td>
</tr>
</table>
</body>
</html>
我试过的XSL是:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" version="5.0"/>
<xsl:template match="/">
<html lang="en">
<head>
<title>test</title>
<style>
table,th, td{border: 1px solid black; padding: 5px;}
</style>
</head>
<body>
<table>
<caption><xsl:value-of select="title"/></caption>
<xsl:for-each select="auto">
<tr>
<td colspan="2" style="text-align:center"><xsl:value-of select="@name"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select="manual">
<tr>
<td><xsl:value-of select="@name"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
但我无法获得预期的结果。在该输入中,手册中有两个结果,需要放在无序列表中。我正在使用 XSLT 1.0,请推荐任何新版本
当您想 select XSLT 程序中的节点时,您必须提供该节点的绝对或相对路径。例如,当您执行 <xsl:template match="/">
并且在该模板内部时,您想要 select 标签 <title>
,您必须给出它的相对路径,如 <xsl:value-of select="manuals/title">
,或 <xsl:value-of select="/manuals/title">
或 <xsl:value-of select="//title">
中的绝对路径,而不仅仅是 <xsl:value-of select="title">
.
我还不得不猜测如何使用 <ul>...</ul>
生成无序列表,因为您的代码中没有预见到它。
试试这个 XSLT 代码:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" version="5.0"/>
<xsl:template match="/">
<html lang="en">
<head>
<title>test</title>
<style>table,th, td {border: 1px solid black; padding: 5px;}</style>
</head>
<body>
<table>
<caption>
<xsl:value-of select="manuals/title"/>
</caption>
<xsl:for-each select="manuals/results/auto">
<tr>
<td colspan="2" style="text-align:center">
<xsl:value-of select="@name"/>
</td>
</tr>
<xsl:for-each select="manual">
<tr>
<td>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:choose>
<xsl:when test="count (result/@column) = 0">
(empty)<!-- you can decide to do something else here -->
</xsl:when>
<xsl:when test="count (result/@column) = 1">
<xsl:value-of select="result/@column"/>
</xsl:when>
<xsl:otherwise>
<ul>
<xsl:for-each select="result/@column">
<li>
<xsl:value-of select="."/>
</li>
</xsl:for-each>
</ul>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
下面是我使用 xsltproc
得到的输出,没有缩进我不知道为什么:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
<style>table,th, td {border: 1px solid black; padding: 5px;}</style>
</head>
<body><table>
<caption>Test</caption>
<tr><td colspan="2" style="text-align:center">Data</td></tr>
<tr>
<td>Blank</td>
<td>Data</td>
</tr>
<tr><td colspan="2" style="text-align:center">View</td></tr>
<tr>
<td>Blank2</td>
<td><ul>
<li>Information</li>
<li>Test</li>
</ul></td>
</tr>
<tr>
<td>Value</td>
<td>Exceptions</td>
</tr>
</table></body>
</html>
我有带属性值的输入 XML,需要使用 XSLT 创建 HTML Table。
输入XML:
<manuals>
<title>Test</title>
<results>
<auto name="Data">
<manual name="Blank">
<result column="Data"/>
</manual>
</auto>
<auto name="View">
<manual name="Blank2">
<result column="Information"/>
<result column="Test"/>
</manual>
<manual name="Value">
<result column="Exceptions"/>
</manual>
</auto>
</results>
</manuals>
预期 HTML:
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>XXX</title>
<style>
table,th, td{border: 1px solid black; padding: 5px;}
</style>
</head>
<body>
<table>
<caption>Test</caption>
<tr>
<td colspan="2" style="text-align:center">Data</td>
</tr>
<tr>
<td>Blank</td>
<td>Data</td>
</tr>
<tr>
<td colspan="2" style="text-align:center">View</td>
</tr>
<tr>
<td>Blank2</td>
<td>
<ul>
<li>Information</li>
<li>Test</li>
</ul>
</td>
</tr>
<tr>
<td>Value</td>
<td>Exceptions</td>
</tr>
</table>
</body>
</html>
我试过的XSL是:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" version="5.0"/>
<xsl:template match="/">
<html lang="en">
<head>
<title>test</title>
<style>
table,th, td{border: 1px solid black; padding: 5px;}
</style>
</head>
<body>
<table>
<caption><xsl:value-of select="title"/></caption>
<xsl:for-each select="auto">
<tr>
<td colspan="2" style="text-align:center"><xsl:value-of select="@name"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select="manual">
<tr>
<td><xsl:value-of select="@name"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
但我无法获得预期的结果。在该输入中,手册中有两个结果,需要放在无序列表中。我正在使用 XSLT 1.0,请推荐任何新版本
当您想 select XSLT 程序中的节点时,您必须提供该节点的绝对或相对路径。例如,当您执行 <xsl:template match="/">
并且在该模板内部时,您想要 select 标签 <title>
,您必须给出它的相对路径,如 <xsl:value-of select="manuals/title">
,或 <xsl:value-of select="/manuals/title">
或 <xsl:value-of select="//title">
中的绝对路径,而不仅仅是 <xsl:value-of select="title">
.
我还不得不猜测如何使用 <ul>...</ul>
生成无序列表,因为您的代码中没有预见到它。
试试这个 XSLT 代码:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" version="5.0"/>
<xsl:template match="/">
<html lang="en">
<head>
<title>test</title>
<style>table,th, td {border: 1px solid black; padding: 5px;}</style>
</head>
<body>
<table>
<caption>
<xsl:value-of select="manuals/title"/>
</caption>
<xsl:for-each select="manuals/results/auto">
<tr>
<td colspan="2" style="text-align:center">
<xsl:value-of select="@name"/>
</td>
</tr>
<xsl:for-each select="manual">
<tr>
<td>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:choose>
<xsl:when test="count (result/@column) = 0">
(empty)<!-- you can decide to do something else here -->
</xsl:when>
<xsl:when test="count (result/@column) = 1">
<xsl:value-of select="result/@column"/>
</xsl:when>
<xsl:otherwise>
<ul>
<xsl:for-each select="result/@column">
<li>
<xsl:value-of select="."/>
</li>
</xsl:for-each>
</ul>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
下面是我使用 xsltproc
得到的输出,没有缩进我不知道为什么:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
<style>table,th, td {border: 1px solid black; padding: 5px;}</style>
</head>
<body><table>
<caption>Test</caption>
<tr><td colspan="2" style="text-align:center">Data</td></tr>
<tr>
<td>Blank</td>
<td>Data</td>
</tr>
<tr><td colspan="2" style="text-align:center">View</td></tr>
<tr>
<td>Blank2</td>
<td><ul>
<li>Information</li>
<li>Test</li>
</ul></td>
</tr>
<tr>
<td>Value</td>
<td>Exceptions</td>
</tr>
</table></body>
</html>