在XSLT中,可以使用param在模板调用中使用xpath表达式的值

时间:2010-01-10 18:44:42

标签: xml xslt

我正在执行xsl转换,在其中我使用以下代码调用带有param的模板

<xsl:call-template name="GenerateColumns">
     <xsl:with-param name="curRow" select="$curRow"/>
     <xsl:with-param name="curCol" select="$curCol + 1"/>
</xsl:call-template>

这会调用一个模板函数,该函数以HTML格式输出表格元素的一部分。 curRow和curCol用于确定我们在表中的行和列。 gbl_maxCols设置为html表中的列数

<xsl:template name="GenerateColumns">
   <xsl:when test="$curCol &lt;= $gbl_maxCols">
       <td>
       <xsl:attribute="colspan">
           <xsl:value-of select="/page/column/@skipColumns"/>
       </xsl:attribute> 
   </xsl:when>
</xsl:template>

这个函数的结果是一组td元素,但是其中一些元素(skipColumn属性大于1的那些元素跨越1列,我需要在下一次调用generateColumns时跳过这么多列。< / p>

这就像我期望的那样,我只是增加了curCol参数,但我有一个案例,我需要使用数学中xml属性skipColumns的值来计算curCol的值。在上面的例子中,我遍历所有列,这适用于我的大多数用例。但是在相同的情况下,我需要跳过一些列,并且需要从xml属性传递该值以计算我需要跳过的列数。

我天真的第一次尝试是这样的

<xsl:call-template name="GenerateColumns">
     <xsl:with-param name="curRow" select="$curRow"/>
     <xsl:with-param name="curCol" select="$curCol + /page/column/@skipColumns"/>
</xsl:call-template>

但不可理喻的是,这似乎不起作用。有没有办法在计算中使用xml页面中的属性来计算xsl中param的值。

我的xml页面是这样的(由于xml文件相当大而编辑很多)

<page>
 <column name="blank" skipColumns="1"/>
 <column name="blank" skipColumns="1"/>
 <column name="test" skipColumns="3"/>
 <column name="blank" skipColumns="1"/>
 <column name="test2" skipColumns="6"/>
</page>

在所有这些之后我想拥有一组td元素,如下面的

<td></td><td></td><td colSpan="3"></td><td></td><td colSpan="6"></td>

如果我只是遍历列,我最终会得到类似这样的东西,这给了我更多的td元素而不是我应该拥有的

<td></td><td></td><td colSpan="3"></td><td></td><td colSpan="6"></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td>

已编辑以提供更多信息

2 个答案:

答案 0 :(得分:0)

我仍然没有完全确定你要做什么,但我可以看到你创建$ curCol值的问题。

您的作业看起来像这样

<xsl:with-param name="curCol" select="$curCol + **/page/column/@skipColumns**"/>

select是将$ curCol的值添加到@skipColumns属性的序列中。这是不允许的。您可以选择特定属性并为其添加值,例如

<xsl:with-param name="curCol" select="$curCol + /page/column**[1]**/@skipColumns"/>

或使用参数

<xsl:with-param name="curCol" select="$curCol + /page/column**[$index]**/@skipColumns"/>

然后你会得到你想要的价值。

答案 1 :(得分:0)

我的理解是,您希望将当前col的编号添加到属性@skipColumns中的值。

假设上下文节点是'column'元素:

<xsl:call-template name="GenerateColumns">
 <xsl:with-param name="curRow" select="$curRow"/>
 <xsl:with-param name="curCol" select="number($curCol) + number(@skipColumns)"/>
</xsl:call-template>