如果您使用的是 XSLT1.0,您可以使用一种称为“Muenchian”分组的技术来获取不同的度量描述,这将构成您的头行的基础,也可用于输出每一行的值。
首先,您定义一个键来通过它们的@desc属性查找度量元素
<xsl:key name="measures" match="measure" use="@desc" />
然后,要获得不同的度量描述,您可以遍历组中首先出现的度量元素,以获取它们的给定@desc属性
<xsl:apply-templates
select="result/measure[generate-id() = generate-id(key('measures', @desc)[1])]"
mode="header" />
然后,对于您的标题,您只需有一个模板来输出描述。
<xsl:template match="measure" mode="header">
<th>
<xsl:value-of select="@desc" />
</th>
</xsl:template>
对于每个结果行,都会做类似的事情,并遍历所有不同的度量值,但唯一的区别是您必须将当前结果元素作为参数传递,以供以后使用。
<xsl:apply-templates
select="/results/result/measure[generate-id() = generate-id(key('measures', @desc)[1])]"
mode="data">
<xsl:with-param name="result" select="." />
</xsl:apply-templates>
然后,在这次与度量匹配的模板中,您可以使用匹配的@desc属性访问结果元素中的度量(并且 id 没有这样的属性,单元格不输出任何内容)
<xsl:template match="measure" mode="data">
<xsl:param name="result" />
<td>
<xsl:value-of select="$result/measure[@desc = current()/@desc]/@value" />
</td>
</xsl:template>
这是完整的 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="measures" match="measure" use="@desc" />
<xsl:template match="/results">
<table>
<tr>
<th>ID</th>
<th>DESC</th>
<xsl:apply-templates select="result/measure[generate-id() = generate-id(key('measures', @desc)[1])]" mode="header" />
</tr>
<xsl:apply-templates select="result" />
</table>
</xsl:template>
<xsl:template match="result">
<tr>
<td><xsl:value-of select="@id" /></td>
<td><xsl:value-of select="@desc" /></td>
<xsl:apply-templates select="/results/result/measure[generate-id() = generate-id(key('measures', @desc)[1])]" mode="data">
<xsl:with-param name="result" select="." />
</xsl:apply-templates>
</tr>
</xsl:template>
<xsl:template match="measure" mode="header">
<th>
<xsl:value-of select="@desc" />
</th>
</xsl:template>
<xsl:template match="measure" mode="data">
<xsl:param name="result" />
<td>
<xsl:value-of select="$result/measure[@desc = current()/@desc]/@value" />
</td>
</xsl:template>
</xsl:stylesheet>
请注意模式属性的使用,因为您有两个与度量元素匹配的模板,它们以不同的方式起作用。
当应用于您的输入 XML 时,将输出以下内容
<table>
<tr>
<th>ID</th>
<th>DESC</th>
<th>VOLT</th>
<th>AMPERE</th>
</tr>
<tr>
<td>1</td>
<td>Voltage and current</td>
<td>1.0</td>
<td>2.0</td>
</tr>
<tr>
<td>2</td>
<td>Current-1</td>
<td/>
<td>5.0</td>
</tr>
</table>