代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  3
  • Tom  · 技术社区  · 16 年前

    在现有的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环境中工作,我无法改变)。

    注意,为了简单起见,我对命名模板进行了很好的修剪。

    3 回复  |  直到 11 年前
        1
  •  2
  •   Teun D    11 年前

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

        2
  •  1
  •   Keith    16 年前

    而不是做一个

    <xsl:call-template..>
    

    ,您是否尝试执行

    <xsl:apply-templates..> 
    

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

        3
  •  1
  •   Robert    14 年前

    在基思建议的后续行动中,您可以使用模式“x”仅在设置了该模式时应用调用模板。

    是的,我知道这个问题很古老,但我在寻找其他问题时偶然发现了这个问题,我想我会为将来的访客提供帮助。

    推荐文章