在现有的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"> </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。,为了简单起见,我修剪了一些命名模板。
答案 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”仅在设置该模式时应用调用模板。
是的,我知道这个问题已经很老了,但我在寻找其他东西的时候偶然发现了它,并认为我会为未来的访客提供信息。