如何将xslt模板应用于字符串?

Mit*_*hon 3 string xslt nodes xslt-1.0

给定一个用于在值周围构建一些html的模板,我想传入一个字符串,而不是一个节点集.作为一个例子,我想连接一些值并将其传递给模板.我怎么能做到这一点呢?

<xsl:template match="text()" mode="kvp-print-single">
    <tr>
        <td colspan="3"><xsl:value-of select="."/></td>
    </tr>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

...

<xsl:apply-templates select="concat=(haba/hiba:text(), ' - ', huba/baba:text())" mode="kvp-print-single"/>
Run Code Online (Sandbox Code Playgroud)

ErrorMsg:xml或样式表文件无效!

异常:System.Xml.Xsl.XsltException:表达式必须求值为节点集.

Tim*_*m C 5

如果目标是重复使用代码,要在多个位置使用模板,那么您可以做的是为模板命名(除了模板匹配),并为其提供默认参数

<xsl:template match="text()" name="kvp-print-single" mode="kvp-print-single">
    <xsl:param name="text" select="." />
    <tr>
        <td colspan="3"><xsl:value-of select="$text"/></td>
    </tr>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

然后使用xsl:call-template以连接字符串作为参数调用它

<xsl:call-template name="kvp-print-single">
   <xsl:with-param name="text" select="concat(haba/hiba:text(), ' - ', huba/baba:text())" />
</xsl:call-template>
Run Code Online (Sandbox Code Playgroud)

注意,当使用xsl:apply-templates匹配时,模板仍将以正常方式匹配"text()"节点.