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

时间:2013-12-02 13:32:56

标签: string xslt xslt-1.0 nodes

给定一个用于在值周围构建一些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:表达式必须求值为节点集。

3 个答案:

答案 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:其他答案需要参数。根据需要使用尽可能多的模块化模板,但如果您不需要它们,为什么还要添加参数呢?