给定一个用于在值周围构建一些html的模板,我想传入一个字符串,而不是一个节点集。作为一个例子,我想连接一些值并将其传递给模板。我怎么能做到这一点?
<xsl:template match="text()" mode="kvp-print-single">
<tr>
<td colspan="3"><xsl:value-of select="."/></td>
</tr>
</xsl:template>
...
<xsl:apply-templates select="concat=(haba/hiba:text(), ' - ', huba/baba:text())" mode="kvp-print-single"/>
ErrorMsg:xml或样式表文件无效!
异常:System.Xml.Xsl.XsltException:表达式必须求值为节点集。
答案 0 :(得分: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>
然后只需使用 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>
注意,使用 xsl:apply-templates 进行匹配时,模板仍会以正常方式匹配“text()”节点。
答案 1 :(得分:2)
您可以使用call-template和命名模板,而不是apply-templates,因此:
<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>
apply-templates的目的是获取一个节点集,并依次将最合适的模板应用于每个节点。调用模板和命名模板允许您将XSLT分解为更易于管理的块,而无需更改上下文。
答案 2 :(得分:0)
您不能“传入字符串,而不是传递节点集”,因为模板不像函数一样被调用。使用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(绝对或甚至相对于匹配元素)。
@Mithon:其他答案需要参数。根据需要使用尽可能多的模块化模板,但如果您不需要它们,为什么还要添加参数呢?