假設我有一個 XML 格式的劇本:
<speech><speaker name="Bob">BOB</speaker> Hey Jim!</speech>
<speech><speaker name="Jim">JIM</speaker> Hey Bob!</speech>
<speech><speaker name="Bob">BOB</speaker> How's Ethel?</speech>
我想使用 XSLT 在 HTML 表中創建說話者的不同值串列,以及每個人說話的次數,如下所示:
<table>
<tr>
<th>Speaker</th>
<th>Frequency</th>
</tr>
<tr>
<td>Bob</td>
<td>2</td>
</tr>
<tr>
<td>Jim</td>
<td>1</td>
</tr> </table>
這是我的模板規則:
<xsl:template match="/">
<html>
<head>Speaker analysis</head>
<body>
<h1>Table of speech frequency</h1>
<table>
<tr><th>Speaker</th><th>Frequency</th></tr>
<xsl:for-each select="distinct-values(//speaker/@name)">
<tr><td><xsl:value-of select="."/></td>
<td><xsl:value-of select="count(../speech[speaker[@name='.']])"/></td></tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
問題在于這一行:
<td><xsl:value-of select="count(../speech[speaker[@name='.']])"/></td>
我真正想告訴它做的是“對于在此 for 回圈中標識的 @name 的給定不同值,計算它在整個檔案中出現的次數”。所以我認為我真的需要從那個屬性值爬回ancestor:: 軸來計算包含它的或元素。但是 oXygen 給出了錯誤資訊。
當然必須有辦法做到這一點?
uj5u.com熱心網友回復:
這是分組的情況,而不是不同的值:
<xsl:for-each-group select="//speaker" group-by="@name">
<tr>
<td>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:value-of select="count(current-group())"/>
</td>
</tr>
</xsl:for-each-group>
需要 XSLT 2.0 或更高版本。
PS 要按照您開始的方式進行操作,您需要定義一個匹配by的鍵,然后計算函式回傳的序列。speakernamekey()
還要注意,該distinct-values()函式回傳一個獨立的值序列,它不屬于輸入樹的一部分;這些值沒有祖先。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359593.html
