我开发了一个基于java的命令行实用程序,它将xml转换为另一个xml文件并生成HTML。在这个程序中,我使用SAX解析器将源xml的内容读入我的java对象,然后使用JAXB生成XML。现在我通过填充HTML内容的字符串来创建HTMl文件,但它会在我的java类中生成硬编码的html代码。根据我的研究,我可以使用XSLT进行XML到HTML的转换。我是XSLT的新手。谁能帮我?请看下面的示例。感谢
XML输入:
<Groups>
<Group>
<GroupName>GroupA</GroupName>
<Role>
<RoleName>Correspondence Team B</RoleName>
<Functions>
<Function>CT2 Work</Function>
<Function>HOL01_My Work</Function>
<Function>HOL02_My Work</Function>
</Functions>
</Role>
</Group>
<GroupName>GroupB</GroupName>
<Role>
<RoleName>Customer Service Rep</RoleName>
<Functions>
<Function>CSR Work</Function>
<Function>HOL01_My Work</Function>
</Functions>
</Role>
</Group>
<Group>
<GroupName>GroupB</GroupName>
<Role>
<RoleName>Dispute Advisor</RoleName>
<Functions>
<Function>DA Work</Function>
<Function>HOL01_My Work</Function>
</Functions>
</Role>
</Group>
<Group>
<GroupName>GroupA</GroupName>
<Role>
<RoleName>Correspondence Team</RoleName>
<Functions>
<Function>CT Work</Function>
<Function>HOL01_My Work</Function>
</Functions>
</Role>
</Group>
<Group>
<GroupName>GroupB</GroupName>
<Role>
<RoleName>Correspondence Team B</RoleName>
<Functions>
<Function>CT2 Work</Function>
<Function>HOL01_My Work</Function>
<Function>HOL02_My Work</Function>
</Functions>
</Role>
</Group>
所需的Html表格格式:
<table border=1>
<tr>
<th>Group Name</th>
<th>Role Name</th>
<th>Function Names</th>
</tr>
<tr>
<td rowspan=5>Group A</td>
<td rowspan=2>Correspondence Team</td>
<td>CT Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<td rowspan=3>Correspondence Team B</td>
<td>CT Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<td rowspan=0>Group B</td>
<td rowspan=2>Customer Service Rep</td>
<td>CSR Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<td rowspan=2>Dispute Advisor</td>
<td>DA Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<td rowspan=2>Correspondence Team</td>
<td>CT Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
</table>
答案 0 :(得分:3)
假设XSLT 2.0(您可以在Saxon 9的帮助下使用Java运行),您可以使用样式表,如
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="html" indent="yes" version="5.0"/>
<xsl:template match="/">
<html lang="en">
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="Groups">
<table frame="border" rules="all">
<thead>
<th>Group Name</th>
<th>Role Name</th>
<th>Function Names</th>
</thead>
<tbody>
<xsl:variable name="groups" as="element(group)*">
<xsl:for-each-group select="Group" group-by="GroupName">
<group name="{current-grouping-key()}" size="{count(current-group()/Role/Functions/Function)}">
<xsl:for-each-group select="current-group()" group-by="Role/RoleName">
<role name="{current-grouping-key()}" size="{count(current-group()/Role/Functions/Function)}">
<xsl:copy-of select="current-group()/Role/Functions/Function"/>
</role>
</xsl:for-each-group>
</group>
</xsl:for-each-group>
</xsl:variable>
<xsl:apply-templates select="$groups/role/Function"/>
</tbody>
</table>
</xsl:template>
<xsl:template match="group/role/Function">
<tr>
<xsl:apply-templates select="." mode="group"/>
<xsl:apply-templates select="." mode="role"/>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
<xsl:template match="group/role[1]/Function[1]" mode="group">
<th rowspan="{../../@size}">
<xsl:value-of select="../../@name"/>
</th>
</xsl:template>
<xsl:template match="group/role[position() gt 1]/Function |
group/role[1]/Function[position() gt 1]" mode="group"/>
<xsl:template match="group/role/Function[1]" mode="role">
<th rowspan="{../@size}">
<xsl:value-of select="../@name"/>
</th>
</xsl:template>
<xsl:template match="group/role/Function[position() gt 1]" mode="role"/>
</xsl:stylesheet>
转换输入文档,如
<Groups>
<Group>
<GroupName>GroupA</GroupName>
<Role>
<RoleName>Correspondence Team B</RoleName>
<Functions>
<Function>CT2 Work</Function>
<Function>HOL01_My Work</Function>
<Function>HOL02_My Work</Function>
</Functions>
</Role>
</Group>
<Group>
<GroupName>GroupB</GroupName>
<Role>
<RoleName>Customer Service Rep</RoleName>
<Functions>
<Function>CSR Work</Function>
<Function>HOL01_My Work</Function>
</Functions>
</Role>
</Group>
<Group>
<GroupName>GroupB</GroupName>
<Role>
<RoleName>Dispute Advisor</RoleName>
<Functions>
<Function>DA Work</Function>
<Function>HOL01_My Work</Function>
</Functions>
</Role>
</Group>
<Group>
<GroupName>GroupA</GroupName>
<Role>
<RoleName>Correspondence Team</RoleName>
<Functions>
<Function>CT Work</Function>
<Function>HOL01_My Work</Function>
</Functions>
</Role>
</Group>
<Group>
<GroupName>GroupB</GroupName>
<Role>
<RoleName>Correspondence Team B</RoleName>
<Functions>
<Function>CT2 Work</Function>
<Function>HOL01_My Work</Function>
<Function>HOL02_My Work</Function>
</Functions>
</Role>
</Group>
</Groups>
进入HTML5,如
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
</head>
<body>
<h1>Test</h1>
<table frame="border" rules="all">
<thead>
<th>Group Name</th>
<th>Role Name</th>
<th>Function Names</th>
</thead>
<tbody>
<tr>
<th rowspan="5">GroupA</th>
<th rowspan="3">Correspondence Team B</th>
<td>CT2 Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<td>HOL02_My Work</td>
</tr>
<tr>
<th rowspan="2">Correspondence Team</th>
<td>CT Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<th rowspan="7">GroupB</th>
<th rowspan="2">Customer Service Rep</th>
<td>CSR Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<th rowspan="2">Dispute Advisor</th>
<td>DA Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<th rowspan="3">Correspondence Team B</th>
<td>CT2 Work</td>
</tr>
<tr>
<td>HOL01_My Work</td>
</tr>
<tr>
<td>HOL02_My Work</td>
</tr>
</tbody>
</table>
</body>
</html>