应用模板后选择子串

时间:2013-12-12 12:04:38

标签: xslt-2.0

我有一个如下所示的XML行。

<title>I. DEFINITION</title>

这里我正在做什么在'。'之前获取值,这很好,但我想在'。'之后为内容应用模板。我不知道我该怎么做。我正在使用下面的XSLT线。

<xsl:apply-templates select="substring-after(.,'. ')"/>

当我使用它时,会抛出错误,它是

XSLT 2.0 Debugging Error: Error: file:///C:/Users/u0138039/Desktop/Proview/HK/ArchboldHK2014/XSLT/Chapters.xsl:508: Not a node item - item has type xs:string with value 'DEFINITION' -   Details: -     XTTE0520: The result of evaluating the 'select' attribute of the <xsl:apply-templates> instruction may only contain nodes

请告诉我如何在'。'

之后在内容上应用模板

感谢。

2 个答案:

答案 0 :(得分:2)

您可以尝试此模板

<xsl:template match="title">
    <xsl:copy>
        <label><xsl:value-of select="substring-before(., '. ')"/></label>
        <caption>
        <xsl:variable name="slicetext" select="substring-after(current()/text()[1], '. ')"/>
        <xsl:value-of select="$slicetext"/><xsl:apply-templates select="text()[position() > 1]|child::node()[not(self::text())]"/>
        </caption>
    </xsl:copy>
</xsl:template>

答案 1 :(得分:0)

使用XSLT 1.0和2.0,您只能为节点编写和应用模板,而不能像字符串这样的原始值。我认为这在XSLT 3.0中有所改变。

在XSLT 2.0中,要进一步处理substring-result的结果,你需要编写一个函数或一个带有字符串参数的命名模板。

如果您真的想要应用模板,首先需要使用xsl:variable创建一个临时文本节点。