XSL不传递参数

  • 本文关键字:参数 XSL xslt xslt-1.0
  • 更新时间 :
  • 英文 :


问题

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

<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 Template。

不确定我要去哪里...任何帮助将不胜感激。

在您显示的示例代码中,您在 c:control 元素之后调用名为 table 模板。P>

<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:*",如果您想应对更多元素,则可以使其更通用。

相关内容

  • 没有找到相关文章

最新更新