【问题标题】:Parameter passing to a call template in xsl将参数传递给 xsl 中的调用模板
【发布时间】:2011-01-28 21:40:50
【问题描述】:

您好,我对 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>

等等……

我正在编写一个调用模板,它将在多行 html 表中显示一行 ()。每行需要记录整个记录集的每个字段的名称、平均值、最小值、最大值等。

所以我想打电话给&lt;xsl:call-template name="DisplayRow"&gt; &lt;xsl:with-param name="fieldname" select="??"/&gt;

调用模板将需要遍历所有记录以查找 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

【问题讨论】:

  • @user594433:请为您发布的输入示例提供所需的输出:很多时候,人们认为他应该做什么,这不是正确的 XSLT 方式。

标签: xslt


【解决方案1】:

您需要为filedName 参数的值选择什么取决于您要在模板中执行的操作。

您可以传入要生成摘要信息的元素的名称:例如&lt;xsl:with-param name="fieldname" select="'a'"/&gt;

您可以通过使用local-name() 来获得它:即&lt;xsl:with-param name="fieldname" select="local-name(.)"/&gt;(如果上下文是这些元素之一)

如果您想为&lt;rec&gt; 的每个孩子生成摘要信息,那么您可以执行以下操作:

此样式表:

<?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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多