参数传递给xsl中的调用模板

时间:2011-01-28 21:40:50

标签: xslt

问候,我对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

1 个答案:

答案 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>