java - 如何使用 XSLT-1.0 创建子表
问题描述
我正在尝试使用 XSLT 和提供的 XML 创建此表: 需要的表
这是提供的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="baile.xsl"?>
<academia nombre="Trassierra">
<curso id="C1" inicio="2019/10/01" fin="2020/06/30" nivel="intermedio">
<baile>tango</baile>
<imagen>imagenes/tango.jpeg</imagen>
<profesor>Ricardo Buenos Aires</profesor>
<sala>1</sala>
<plazas>10</plazas>
<horario>
<dia>lunes</dia>
<hora>17:00:00</hora>
<dia>miercoles</dia>
<hora>18:30:00</hora>
<dia>viérnes</dia>
<hora>18:00:00</hora>
</horario>
<precio cuota="trimestral">55</precio>
<matriculas>
<alumno>
<dni>30987123Z</dni>
<nombre>Jose Maria Ortiz Ots</nombre>
</alumno>
<alumno>
<dni>29876013J</dni>
<nombre>Maria Gonzalo Hernandez</nombre>
</alumno>
</matriculas>
</curso>
<curso id="C2" inicio="2019/01/01" fin="2019/06/30" nivel="intermedio">
<baile>salsa</baile>
<imagen>imagenes/salsa.jpeg</imagen>
<profesor>Raquel Langa</profesor>
<sala>2</sala>
<plazas>15</plazas>
<horario>
<dia>martes</dia>
<hora>19:00:00</hora>
<dia>jueves</dia>
<hora>19:00:00</hora>
</horario>
<precio cuota="mensual">20</precio>
<matriculas>
<alumno>
<dni>30983123B</dni>
<nombre>Jose Antonio Casado Alcaide</nombre>
</alumno>
<alumno>
<dni>34987245H</dni>
<nombre>Maria Angeles Luque Montes</nombre>
</alumno>
</matriculas>
</curso>
<curso id="C3" inicio="2019/03/01" fin="2019/03/30" nivel="iniciacion">
<baile>bachata</baile>
<imagen>imagenes/bachata.jpeg</imagen>
<profesor>Raquel Langa</profesor>
<sala>3</sala>
<plazas>10</plazas>
<horario>
<dia>viernes</dia>
<hora>19:00:00</hora>
</horario>
<matriculas>
<alumno>
<dni>39283827A</dni>
<nombre>Manuel Jimenez Luque</nombre>
</alumno>
<alumno>
<dni>29098373H</dni>
<nombre>Luisa Medina Ortega</nombre>
</alumno>
</matriculas>
</curso>
<curso id="C4" inicio="2019/07/01" fin="2019/08/30" nivel="intermedio">
<baile>zumba</baile>
<profesor>Antonio Rodríguez Luanda</profesor>
<sala>1</sala>
<plazas>5</plazas>
<horario>
<dia>viérnes</dia>
<hora>21:00:00</hora>
<dia>sábado</dia>
<hora>22:00:00</hora>
</horario>
<matriculas>
<alumno>
<dni>30987092K</dni>
<nombre>Marisa Paredes Sanchez</nombre>
</alumno>
<alumno>
<dni>29087296R</dni>
<nombre>Maribel Henández Pons</nombre>
</alumno>
<alumno>
<dni>29098373A</dni>
<nombre>Luisa Medina Ortega</nombre>
</alumno>
</matriculas>
</curso>
</academia>
这就是我试图用 XSLT-1.0 做的事情
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html style="color: #369;">
<head>
<title>baile.xsl</title>
</head>
<body>
<h1>
<strong>Curso de tango</strong>
</h1>
<p>
<img src="imagenes/tango.jpeg" align="center" height="100"/>
</p>
<table border="1" style="border-collapse">
<thead>
<strong>
<th style="text-aling:center">Profesor</th>
<th style="text-aling:center">Nº Plazas</th>
<th colspan="2" style="text-aling:center">Horario</th>
</strong>
</thead>
<tbody>
<xsl:for-each select="academia/curso" >
<xsl:if test="baile='tango'">
<tr>
<td rowspan="4">
<xsl:value-of select="profesor"/>
</td>
<td rowspan="4">
<xsl:value-of select="plazas"/>
</td>
<td>
<table>
<tr>
<xsl:for-each select="horario">
<tr>
<xsl:for-each select="dia">
<td>
<xsl:value-of select="/."/>
</td>
</xsl:for-each>
<xsl:for-each select="hora">
<td>
<xsl:value-of select="/."/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tr>
</table>
</td>
</tr>
</xsl:if>
</xsl:for-each>
</tbody>
</table>
<h2>Matriculados</h2>
<table border="1" style="border-collapse:separate;border-spacing:2px">
<xsl:for-each select="academia/curso/baile/matriculas">
<xsl:if test="baile='tango'">
<tr>
<td>
<xsl:value-of select="nombre"/>
</td>
<td>
<xsl:value-of select="dni"/>
</td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
"horario" 表输出都在一行中,我知道也许我必须遍历 "horario" 并提取每个 "day" 和 "hour" ,但我不知道该怎么做,我可以只得到一对或全部在一条线上。
有什么帮助吗?
非常感谢和问候
解决方案
我调试并重新排列了您的 XSLT 样式表:
- 你确实有一个错字:
text-aling:center
应该是text-align:center
td
不需要rowspan="4"
属性_- 您错误地将
<strong>
标签放在表格标签块上,而不是单个文本标签上。 我将您的模板分为两部分:
- HTML部分
curso
部分_
因此,将您的 XSLT 更改为以下内容应该会改善您的结果:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/academia">
<html style="color: #369;">
<head>
<title>baile.xsl</title>
</head>
<body>
<h1>
<strong>Curso de tango</strong>
</h1>
<p>
<img src="imagenes/tango.jpeg" align="center" height="100"/>
</p>
<table border="1" style="border-collapse">
<thead>
<th style="text-align:center">Profesor</th>
<th style="text-align:center">Nº Plazas</th>
<th colspan="2" style="text-align:center">Horario</th>
</thead>
<xsl:apply-templates select="curso"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="curso">
<tr>
<td rowspan="1">
<xsl:value-of select="profesor"/>
</td>
<td rowspan="1" style="text-align:center">
<xsl:value-of select="plazas"/>
</td>
<td>
<table border="1">
<xsl:for-each select="horario">
<xsl:for-each select="dia">
<tr>
<td>
<xsl:value-of select="."/>
</td>
<td>
<xsl:value-of select="following-sibling::hora[1]"/>
</td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</td>
</tr>
<h2>Matriculados</h2>
<table border="1" style="border-collapse:separate;border-spacing:2px">
<xsl:for-each select="matriculas/alumno[../../baile='tango']">
<tr>
<td>
<xsl:value-of select="nombre"/>
</td>
<td>
<xsl:value-of select="dni"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
部分输出是:
推荐阅读
- javascript - 连接 IO 未登录控制台
- azure-stream-analytics - 带有流作业的 CI/CD 在 AZURE 门户中构建
- html - 为导航栏设置下划线动画
- php - 日期验证器检查格式“Ym”在第 02 个月(2 月)失败?
- python - 安装tensorflow时出错
- google-sheets - 用数字过滤“C列”中“NBA”和“D列”最后一行之间的数据
- javascript - 如何将条形图包含在我的传单地图中?
- xml - 全局 TDS 配置更改
- rx-java2 - 无法使用 RxJava2 导入 SyncOnSubscribe
- javascript - 在 Javascript HTML 中访问 Django 视图中的上下文变量(列表)