如果您使用的是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>
是否使用XSLT1.0或者XSLT2.0? –
我使用的是xslt 1.0 – styken