1

是否可以将命名模板的参数指定为另一个模板中的匹配模式?

在这里,如果我尝试调用“excerpt”模板并将 XPath 作为“path”参数传递,我会收到错误消息:

<xsl:template name="excerpt">
    <xsl:param name="path" select="''" />
    <xsl:apply-templates select="$path" />
</xsl:template>

<xsl:template match="$path">
    <article class="newsarticle">
        <h2><a href="{$root}/news/view/{title/@handle}"><xsl:value-of select="title" /></a></h2>
        <xsl:copy-of select="excerpt/node()" />
    </article>
</xsl:template>

我可以用 来完成它<xsl:for-each>,但我想知道是否有一个使用类似于上述方法的好的解决方案。

编辑:这是我想要完成的工作,使用<xsl:for-each>

<xsl:template name="excerpt">
    <xsl:param name="path" select="''" />
    <xsl:for-each select="$path">
        <article class="newsarticle">
            <h2><a href="{$root}/news/view/{title/@handle}"><xsl:value-of select="title" /></a></h2>
            <xsl:copy-of select="excerpt/node()" />
        </article>
    </xsl:for-each>
</xsl:template>

编辑:调用模板的示例:

<xsl:call-template name="excerpt">
    <xsl:with-param name="path" select="path/to/nodeset" />
</xsl:call-template>
4

2 回答 2

1

感谢您的附加信息。这里要澄清的是,在call-template那里,您传递的是节点集,而不是路径。如果没有复杂的解析逻辑或扩展函数,路径的字符串值在 XSLT 1.0 中几乎毫无价值。

有一种方法可以做你想做的事,只是方式与你的设想略有不同。您只需要使用具有通用match值和mode值的模板,就像这样。

<xsl:template name="excerpt">
    <xsl:param name="items" select="''" />
    <xsl:apply-templates select="$items" mode="excerptItem" />
</xsl:template>

<xsl:template match="node() | @*" mode="excerptItem">
    <article class="newsarticle">
        <h2>
          <a href="{$root}/news/view/{title/@handle}">
             <xsl:value-of select="title" />
          </a>
        </h2>
        <xsl:copy-of select="excerpt/node()" />
    </article>
</xsl:template>

但是,如果命名模板仅用于调用匹配模板,那么您根本不需要命名模板。您可以直接使用匹配模板:

<xsl:apply-templates select="path/to/nodeset" mode="excerptItem" />

mode属性的目的是当您在 中指定modeapply-templates,XSLT 将只考虑也具有相同mode值的模板。因此,您可以定义两个不同的模板,以不同的方式处理相同的元素:

<xsl:template match="Item" mode="header">
     Item in header: <xsl:value-of select="." />
</xsl:template>
<xsl:template match="Item" mode="body">
     Item in body: <xsl:value-of select="." />
</xsl:template>

然后,您可以指定要在不同时间使用哪一个:

<div id="header">
    <xsl:apply-templates match="/root/Items/Item" mode="header" />
</div>
<div id="body">
    <xsl:apply-templates match="/root/Items/Item" mode="body" />
</div>

并且在每种情况下都将使用适当的。您可以在此处阅读有关模式的更多信息。

node() | @*是匹配任何节点或属性的通用 XPath,因此如果您在match模板的属性中使用它,您可以创建一个几乎匹配您apply-templates在)。将其与 a 结合使用,mode您可以创建一个模板,您可以在任何节点上调用,并且仅在您想要的特定时间调用。在您的示例中,您将与此模板一起使用的元素看起来总是相同的,因此明确指定它可能是更好的做法:

<xsl:template match="ExportItem" mode="excerptItem">
于 2013-01-19T18:00:35.863 回答
0

是否可以获取命名模板的参数以充当另一个模板中的匹配路径?

不,在 XSLT 2.0 中,模板的匹配模式只能包含变量引用作为id()函数的参数。

有关模式的完整语法,请参阅 XSLT 2.0 W3C 规范

http://www.w3.org/TR/xslt20/#pattern-syntax

在 XSLT 1.0 中,在匹配模式中的任何位置都有变量引用是错误的

于 2013-01-19T18:04:49.370 回答