将节点作为XSL模板参数传递

时间:2009-09-30 13:47:28

标签: xslt

在现有的XSL样式表中,我将字符串传递给命名模板。由于需求的变化,我现在需要显示四个字符串,即我显示的字符串及其三个兄弟。我试图传递他们的父元素(下面代码中的PETrailingFund),而不是将四个单独的字符串传递给命名模板,

 <xsl:call-template name="row">
  <xsl:with-param name="label">Price/Earnings Trailing</xsl:with-param>
  <xsl:with-param name="formatMarker">x</xsl:with-param>
  <xsl:with-param name="fund" select="PETrailingFund" />
  <xsl:with-param name="benchmark">
    <xsl:value-of select="benchmark/PETrailingBenchmark"/>
  </xsl:with-param>
  <xsl:with-param name="benchmark2">
    <xsl:value-of select="benchmark2/PETrailingBenchmark"/>
  </xsl:with-param>
</xsl:call-template>

但是当我尝试使用命名模板中的“fund”参数时,转换就会爆发:

<xsl:template name="row">
  <xsl:param name="label" />
  <xsl:param name="fund" />
  <xsl:param name="benchmark">NOT PROVIDED</xsl:param>
  <xsl:param name="benchmark2">NOT PROVIDED</xsl:param>
  <xsl:param name="formatMarker">&#160;</xsl:param>
  <xsl:param name="useDecimalFormatter">yes</xsl:param>
  <tr>
    <td class="first popup">
      <xsl:value-of select="$label" disable-output-escaping="yes"/>
    </td>
    <td>
      <xsl:if test="$benchmark = 'NOT PROVIDED'">
        <xsl:attribute name="class">last</xsl:attribute>
      </xsl:if>
      <xsl:value-of select="$fund/child::*" />
      <xsl:value-of select="$formatMarker"/>
    </td>
  </tr>
</xsl:template>

从我读过的内容来看,我并没有真正传递节点而是传递结果树片段,我需要将它返回到节点(或节点集)。这是准确的还是我做错了什么?我将如何转换它(我在PHP5环境中工作,我无法改变)。

N.B。,为了简单起见,我修剪了一些命名模板。

3 个答案:

答案 0 :(得分:2)

这在XSLT 1.0中是件令人讨厌的事情。在2.0中,这会自动发生。在1.0中,您需要一个自定义函数,通常称为blah:node-set。它可用于许多XSLT工具包(我不知道你的或PHP)。如果您有权访问EXSLT,它也包含一个。示例:http://www.xml.com/pub/a/2003/07/16/nodeset.html

答案 1 :(得分:1)

而不是做

<xsl:call-template..>

,你有没有试过做

<xsl:apply-templates..> 

在有问题的节点或节点上?

答案 2 :(得分:1)

在跟随Keith的建议后,您可以使用mode =“x”仅在设置该模式时应用调用模板。

是的,我知道这个问题已经很老了,但我在寻找其他东西的时候偶然发现了它,并认为我会为未来的访客提供信息。