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

String 如何将xslt模板应用于字符串?,string,xslt,xslt-1.0,nodes,String,Xslt,Xslt 1.0,Nodes,给定一个用于围绕值构建一些html的模板,我希望传入一个字符串,而不是一个节点集。作为一个例子,我想concat一些值并将其传递给模板。我怎样才能做到这一点呢 <xsl:template match="text()" mode="kvp-print-single"> <tr> <td colspan="3"><xsl:value-of select="."/></td> </tr> </

给定一个用于围绕值构建一些html的模板,我希望传入一个字符串,而不是一个节点集。作为一个例子,我想concat一些值并将其传递给模板。我怎样才能做到这一点呢

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


ErrorMsg:xml或样式表文件无效


异常:System.Xml.Xsl.XsltException:表达式必须计算为一个节点集。

如果目标是代码重用,则要在多个位置使用模板,则可以为模板指定一个名称(除了模板匹配之外),并为其指定一个默认参数

<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>
<xsl:call-template name="kvp-print-single">
   <xsl:with-param name="text" select="concat(haba/hiba:text(), ' - ', huba/baba:text())" />
</xsl:call-template>

然后只需使用xsl:call template将连接的字符串作为参数来调用它

<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>
<xsl:call-template name="kvp-print-single">
   <xsl:with-param name="text" select="concat(haba/hiba:text(), ' - ', huba/baba:text())" />
</xsl:call-template>


注意,当使用xsl:apply templates进行匹配时,模板仍将以正常方式匹配“text()”节点,因此:

<xsl:template name="kvp-print-single">
  <xsl:param name="theValue"/>
   <tr>
        <td colspan="3"><xsl:value-of select="$theValue"/></td>
    </tr>
</xsl:template>

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

应用模板的要点是获取一个节点集,然后依次将最合适的模板应用于每个节点。调用模板和命名模板允许您将XSLT分解为更易于管理的块,而无需更改上下文。

您不能“传入字符串,而不是节点集”,因为模板的调用与函数不同。使用XSLT,不是代码控制执行顺序,而是数据通过匹配模板来控制执行顺序。可以使用可以调用而不是匹配的命名模板,但要传递值,可以使用每个模板的参数

在您的情况下,您甚至不必这样做,因为您可以处理文本部分(给定haba/hiba是地址),如下所示:

<xsl:template match="some_element" mode="kvp-print-single">
  <tr>
    <td colspan="3">
      <xsl:value-of select="concat=(/root/haba/hiba/text(), ' - ', /root/huba/baba/text())"/>
    </td>
  </tr>
</xsl:template>  

当然,地址必须是正确的XPath(绝对的,甚至相对于匹配元素)


@米通:其他答案需要参数。使用尽可能多的模块化模板,但如果不需要,为什么还要添加参数?

这很有趣!这是我第一次看到同时具有
name
match
属性的模板!我不认为我可以在一个命名的模板中找到匹配项,但我明白了。。我想我是被强制使用上下文(必须是一个节点(集合))所困扰,以至于我没有想到显而易见的。嗯。。奇怪的是。。我就是这样开始的。我必须放弃它,因为我想要一种更简洁的方法来调用模板(比如使用select属性,而不是包含节点xsl:with param和所有那些膨胀)。如果将选择移动到模板中,则无法实现其目的,即模块化,以便我可以在一个位置将tr更改为div或任何内容,并将其级联。根据您的方法,我需要为每个选择提供一个模板。您提到的命名模板可能是正确的方向…您是正确的。不得不把Tim C的回答作为解决方案,因为他比你领先了整整一分钟!XDT值得注意的是,在XSLT 3.0中,您可以将模板应用于任何值,包括字符串。