重复调用xsl模板时,避免多次传递参数

时间:2016-11-10 22:21:42

标签: xslt-1.0

我有一个模板被调用(不夸张)大约100个参数左右。我需要多次调用此模板,因为我需要更改父节点 - 有时它不存在,有时会有几个节点,并且有几个值可以采用。

例如当前设置的示例片段:

<xsl:choose>
  <xsl:when test="$test='1'">
    <body1>
      <body3>
        <xsl:call-template name="template1">
          <xsl:with-param name="param1" select="$previouslydefined1" />
           .
           . 
           .
          <xsl:with-param name="param100" select="$previouslydefined100" />
        </xsl:call-template>
      <body3>
    </body1>
  </when>
  <xsl:when test="$test='2'">
    <body2>
      <xsl:call-template name="template1">
        <xsl:with-param name="param1" select="$previouslydefined1" />
         .
         .
         .
        <xsl:with-param name="param100" select="$previouslydefined100" />
      </xsl:call-template>
    </body2>
  </when>
  <xsl:otherwise>
    <xsl:call-template name="template1">
      <xsl:with-param name="param1" select="$previouslydefined1" />
       .
       .
       .
      <xsl:with-param name="param100" select="$previouslydefined100" />
    </xsl:call-template>
  </otherwise>
</xsl:choose>

我觉得必须有一个更好的方法来做到这一点(可能是几个),而不是反复输入大量的参数,但我正在画一个空白。

我有两种方法,我知道这些方法不起作用,但可能有一种修改后的实现方式。

单独选择节点周围的语句(失败 - 语法错误):

<xsl:choose>
  <xsl:when test="$test='1'">
    <body1>
  </when>
  <xsl:when test="$test='2'">
    <body2>
  </when>
  <xsl:otherwise/>
    <xsl:call-template name="template1">
      <xsl:with-param name="param1" select="$previouslydefined1" />
       .
       .
       .
      <xsl:with-param name="param1" select="$previouslydefined100" />
    </xsl:call-template>
    <xsl:choose>
  <xsl:when test="$test='1'">
    </body1>
  </when>
  <xsl:when test="$test='2'">
    </body2>
  </when>
  <xsl:otherwise/>
</xsl:choose>

使用值来设置节点(失败 - 值可以为空,在这种情况下标签不应该存在):

<xsl:element name="{$node}">
  <xsl:element name="{$node2}">
    <xsl:call-template name="template1">
      <xsl:with-param name="param1" select="$previouslydefined1" />
       .
       .
       .
      <xsl:with-param name="param1" select="$previouslydefined100" />
    </xsl:call-template>
  </xsl:element>
</xsl:element>

我也明白应该可以使用隧道(也许) - 我现在正在检查这种可能性。

1 个答案:

答案 0 :(得分:0)

似乎我搞砸了我通过参数设置节点的原始实现。可以将值保留为空,在这种情况下,不会创建我最初查找的节点。通过使用必要的最大可能节点数然后根据需要填充我只能模板一次:

 <script>$(function(){ ReadyDashboard.init(); });</script>