问题
从通配的templte匹配中传出时,我的参数会变空。
我的xml来源:
<c:control name="table" flags="all-txt-align-top all-txt-unbold">
<div xmlns="http://www.w3.org/1999/xhtml">
<thead>
<tr>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td> </td>
</tr>
</tbody>
</c:control>
我的XSL:
最初的c:control[@name='table']
匹配与更广泛的XSL架构相关,并从主模板中拆分调用
<xsl:template match="c:control[@name='table']">
<xsl:call-template name="table" />
</xsl:template>
然后在另一个文件中调用一个命名模板,该文件不应该更改我的起始引用 - 我仍然可以引用c:control [@ name ='table'],就好像我在匹配的模板中一样。 / p>
<xsl:template name="table">
<xsl:variable name="all-txt-top">
<xsl:if test="contains(@flags,'all-txt-align-top')">true</xsl:if>
</xsl:variable>
<xsl:variable name="all-txt-unbold" select="contains(@flags,'all-txt-unbold')" />
<div xmlns="http://www.w3.org/1999/xhtml">
<table>
<xsl:apply-templates select="xhtml:*" mode="table">
<xsl:with-param name="all-txt-top" select="$all-txt-top" />
<xsl:with-param name="all-txt-unbold" select="$all-txt-unbold" />
</xsl:apply-templates>
</table>
</div>
</xsl:template>
如果我在上面的模板中获得all-txt-top
的值,它会按预期工作。
但是,尝试将其传递给下面的模板是失败的 - 我没有得到任何东西。
<xsl:template match="xhtml:thead|xhtml:tbody" mode="table">
<xsl:param name="all-txt-top" />
<xsl:param name="all-txt-unbold" />
<xsl:element name="{local-name()}">
<xsl:apply-templates select="*" mode="table" />
</xsl:element>
</xsl:template>
即使我尝试将一个简单的字符串作为参数传递 - 它也不会使它成为xhtml:thead模板。
不确定我哪里出错了...非常感谢任何帮助。
答案 0 :(得分:2)
在您向我们展示的示例代码中,在 c:control 元素匹配后调用指定的表格模板
<xsl:template match="c:control[@name='table']">
<xsl:call-template name="table" />
</xsl:template>
这意味着在表格模板中,当前的上下文元素是 c:control 。但是,在您的示例XML中, c:control 的唯一子元素是div元素。因此,当您执行apply-templates ....
<xsl:apply-templates select="xhtml:*" mode="table">
...此时将会找到与 xhtml:div 相匹配的模板。如果您没有这样的模板,则默认模板匹配将启动,这将忽略该元素并处理其子项。这不会传递任何参数,因此您匹配 xhtml:thead 的模板将没有任何参数值。
一种解决方案是使模板专门匹配xhtml:div元素,并传递属性
<xsl:template match="xhtml:div" mode="table">
<xsl:param name="all-txt-top"/>
<xsl:param name="all-txt-unbold"/>
<xsl:apply-templates select="xhtml:*" mode="table">
<xsl:with-param name="all-txt-top" select="$all-txt-top"/>
<xsl:with-param name="all-txt-unbold" select="$all-txt-unbold"/>
</xsl:apply-templates>
</xsl:template>
事实上,您可以将模板匹配更改为“xhtml:*”,以便在您想要处理更多元素时更加通用。