您可以在 XSLT3 的 CVT 中调用命名模板吗?

Can you call a named template inside a CVT in XSLT3?

我的输入如下:

<party>
    <name>Jessica's 18th birthday</name>
    <participants>
        <participant>
            <name>Jessica</name>
        </participant>
        <participant>
            <name>Aron</name>
        </participant>
        <participant>
            <name>Steve</name>
        </participant>
    </participants>
</party>

我创建了一个名为 template 的实用程序,它给定一个 party 元素,将所有参与者姓名转换为逗号分隔的字符串:

<xsl:template name="list-participants">
    <xsl:param name="party"/>
    <xsl:value-of select="$party/participants/participant ! name" separator=";"/>
</xsl:template>

我在这里使用 XSLT3。我在我的样式表中使用了所谓的内容值模板 (CVT),因为这使内容更具可读性:

name: {name}

而不是

name: <xsl:value-of select="name"/>

现在我的问题是:是否可以在这里使用这些 {...} 扩展以及 execute/call list-participants 模板?基本上,我想做如下事情:

<xsl:template match="party">
    The following persons will be present at the party: {list-participants(party=.)}
</xsl:template>

这里的.指的是当前的party元素。 (以上是伪核心,希望它有助于使我的问题更清楚,不要让快速的读者感到困惑。)

你可以说我想做一个函数调用,就像在过程语言中看到的那样。

这(在某种程度上)在 XSLT3 中可能吗?

如果您使用函数而不是命名模板,则可以执行此操作

<xsl:template match="party">
    <xsl:text>The following persons will be present at the party:{my:list-participants(.)}</xsl:text>
</xsl:template>

<xsl:function name="my:list-participants">
    <xsl:param name="party"/>
    <xsl:value-of select="$party/participants/participant/name" separator=";"/>
</xsl:function>

这里的命名空间前缀my可以根据自己的喜好来定义。

http://xsltfiddle.liberty-development.net/gWEamKN