我必须将xml转换为HTML。我需要识别具有公共值的元素,并将其合并到HTML中的单个表列中
下面是一个示例XML我必须将xml转换为HTML。我需要识别具有公共值的元素,并将其合并到HTML中的单个表列中,xml,xslt-1.0,xslt-2.0,xslt-grouping,Xml,Xslt 1.0,Xslt 2.0,Xslt Grouping,下面是一个示例XML <?xml version='1.0' encoding='UTF-8'?> <message> <body> <asset> <asset-id>test_01</asset-id> <asset-name>report_test</asset-name> <asset-version>1</asset-version>
<?xml version='1.0' encoding='UTF-8'?>
<message>
<body>
<asset>
<asset-id>test_01</asset-id>
<asset-name>report_test</asset-name>
<asset-version>1</asset-version>
<entity>
<id>project_test</id>
<entity-record>
<id>864d6141-712b-11e7-b775-f9304f8b3051#-</id>
<field>
<id>name</id>
<value>Transport</value>
</field>
<field>
<id>task</id>
<value>Person1</value>
</field>
</entity-record>
<entity-record>
<id>864d6141-812b-11e7-b775-f9304f8b3951#-</id>
<field>
<id>name</id>
<value>Transport</value>
</field>
<field>
<id>task</id>
<value>Person2</value>
</field>
</entity-record>
<entity-record>
<id>864d6141-712b-11e7-b775-f9314f8b3951#-</id>
<field>
<id>name</id>
<value>Food </value>
</field>
<field>
<id>task</id>
<value>Person3</value>
</field>
</entity-record>
<entity-record>
<id>864e6141-712b-11e7-b775-f9304f8b3951#-</id>
<field>
<id>name</id>
<value>Food</value>
</field>
<field>
<id>task</id>
<value>Person4</value>
</field>
</entity-record>
<entity-record>
<field>
<id>name</id>
<value>Food</value>
</field>
<field>
<id>task</id>
<value>Person5</value>
</field>
</entity-record>
<entity-record>
<field>
<id>name</id>
<value>Transport</value>
</field>
<field>
<id>task</id>
<value>Person3</value>
</field>
</entity-record>
</entity>
</asset>
</body>
</message>
在删除第二个for循环时,即保持代码不在for循环中,
它似乎至少显示了值。
这句话到底是什么意思?
在“.”的值上也显示id和值,这就是我在本例中使用./value的原因。
任何帮助都会很好!
谢谢如果您确实在使用XSLT 2.0处理器,那么请尝试将此作为起点:
XSLT2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/message">
<html>
<body>
<table border="1">
<tr>
<th>Project</th>
<th>Task</th>
</tr>
<!-- group by name -->
<xsl:for-each-group select="body/asset/entity/entity-record" group-by="field[id='name']/value">
<xsl:variable name="tasks">
<!-- group by task -->
<xsl:for-each-group select="current-group()" group-by="field[id='task']/value">
<tr>
<td>
<xsl:value-of select="current-grouping-key()" />
</td>
</tr>
</xsl:for-each-group>
</xsl:variable>
<tr>
<td rowspan="{1 + count($tasks/tr)}">
<xsl:value-of select="current-grouping-key()" />
</td>
</tr>
<xsl:copy-of select="$tasks"/>
</xsl:for-each-group>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
项目
任务
输出应如下所示:
这是在调整您的输入示例以删除食品中的多余空间之后,我不明白您想要什么作为输出-请用文字解释逻辑。--如果您可以使用XSLT2.0,那么为什么不使用xsl:for each group
而不是Muenchian分组呢?而且我在您的输入中看不到任何数量。
<html>
<body>
<table border="1">
<tr>
<td>Project</td>
<td>Task</td>
</tr>
<tr>
<tr>
<td>Food</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Person4</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Food</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Person5</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Food </td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Person3</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Transport</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Person1</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Transport</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Person2</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Transport</td>
<td rowspan="0"></td>
<td></td>
</tr>
<tr>
<td>Person3</td>
<td rowspan="0"></td>
<td></td>
</tr>
</tr>
</table>
</body>
</html>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/message">
<html>
<body>
<table border="1">
<tr>
<th>Project</th>
<th>Task</th>
</tr>
<!-- group by name -->
<xsl:for-each-group select="body/asset/entity/entity-record" group-by="field[id='name']/value">
<xsl:variable name="tasks">
<!-- group by task -->
<xsl:for-each-group select="current-group()" group-by="field[id='task']/value">
<tr>
<td>
<xsl:value-of select="current-grouping-key()" />
</td>
</tr>
</xsl:for-each-group>
</xsl:variable>
<tr>
<td rowspan="{1 + count($tasks/tr)}">
<xsl:value-of select="current-grouping-key()" />
</td>
</tr>
<xsl:copy-of select="$tasks"/>
</xsl:for-each-group>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>