0

问题

从通配符模板匹配通过时,我的参数为空。

我的 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'] ,就好像我在匹配的模板中一样。

<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 模板。

不知道我哪里出错了......任何帮助将不胜感激。

4

1 回答 1

2

在您向我们展示的示例代码中,您在匹配c:control元素后调用命名模板

<xsl:template match="c:control[@name='table']">
  <xsl:call-template name="table" />
</xsl:template> 

这意味着在表格模板中,当前上下文元素是c:control但是,在您的示例 XML 中, c:control的唯一子元素是 div 元素。因此,当您执行应用模板时......

<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:*”以使其更通用。

于 2012-10-17T11:32:24.540 回答