问候,我对XSL有点新,并且对调用模板和参数有疑问。
假设我有以下xml:
<rec>
<a>1</a>
<b>2</b>
<c>3</c>
(etc.)
</rec>
<rec>
<a>4</a>
<b>9</b>
<c>2</c>
(etc.)
</rec>
等...
我正在编写一个调用模板,它将在multirow html表中显示一个row()。每行需要记录整个记录集的每个字段的名称,平均值,最小值,最大值等。
所以我想致电<xsl:call-template name="DisplayRow"> <xsl:with-param name="fieldname" select="??"/>
调用模板需要遍历所有记录以查找avg,min,max等,因此我不确定要将调用参数传递给什么。我希望能够传入字段名称(a,b,c等)并让它以这种方式工作,但是当我这样做时无法编译我的代码。
例如,要找到字段'a'的最大值,我会执行以下操作:
<xsl:for-each select="/Rec[a!='NaN']">
<xsl:sort data-type="number" select="a" order="ascending"/>
<xsl:if test="position()=1">
等
对于Avg我会做(跳过NaN):
<xsl:value-of select="sum(/rec/a[number(.)=number(.)])
div count(/rec/a[number(.)=number(.)])"/>
等
我还需要在行中打印出文字名称(例如“a”)。
TIA
答案 0 :(得分:4)
您需要为filedName
param的值选择什么取决于您要在模板中执行的操作。
您可以传入要生成摘要信息的元素的名称:例如: <xsl:with-param name="fieldname" select="'a'"/>
您可以使用local-name()
获取该内容:即<xsl:with-param name="fieldname" select="local-name(.)"/>
(如果上下文是其中一个元素)
如果您想为<rec>
的每个孩子生成摘要信息,那么您可以执行以下操作:
此样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes" />
<xsl:key name="names" match="/records/rec/*" use="local-name(.)"/>
<xsl:template match="/">
<table>
<tr>
<td>Name</td>
<td>Count</td>
<td>Min</td>
<td>Max</td>
<td>Avg</td>
</tr>
<xsl:for-each select="/records/rec/*[generate-id(.) = generate-id(key('names', local-name(.)))]">
<xsl:call-template name="displayRow">
<xsl:with-param name="fieldName" select="local-name(.)"></xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="displayRow">
<xsl:param name="fieldName"/>
<tr>
<td>
<xsl:value-of select="local-name(/records/rec/*[local-name()=$fieldName])"/>
</td>
<td>
<xsl:value-of select="count(/records/rec/*[local-name()=$fieldName])" />
</td>
<td>
<xsl:for-each select="/records/rec/*[local-name()=$fieldName][number(.)!='NaN']">
<xsl:sort data-type="number" select="." order="ascending"/>
<xsl:if test="position()=1">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</td>
<td>
<xsl:for-each
select="/records/rec/*[local-name()=$fieldName][number(.)!='NaN']">
<xsl:sort data-type="number" select="." order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</td>
<td>
<xsl:value-of
select="sum(/records/rec/*[local-name()=$fieldName] [number(.)=number(.)])
div count(/records/rec/*[local-name()=$fieldName][number(.)=number(.)])"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
针对此XML 运行(示例XML包装在文档元素中以使其格式正确):
<records>
<rec>
<a>1</a>
<b>2</b>
<c>3</c>
(etc.)
</rec>
<rec>
<a>4</a>
<b>9</b>
<c>2</c>
(etc.)
</rec>
</records>
生成以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tr>
<td>Name</td>
<td>Count</td>
<td>Min</td>
<td>Max</td>
<td>Avg</td>
</tr>
<tr>
<td>a</td>
<td>2</td>
<td>1</td>
<td>4</td>
<td>2.5</td>
</tr>
<tr>
<td>b</td>
<td>2</td>
<td>2</td>
<td>9</td>
<td>5.5</td>
</tr>
<tr>
<td>c</td>
<td>2</td>
<td>2</td>
<td>3</td>
<td>2.5</td>
</tr>
</table>