user2423959
user2423959

Reputation: 834

apply templates select substring after

I've an XML line like the below.

<title>I. DEFINITION</title>

Here what i'm doing getting the value before '.', this is fine but i want to apply-templates for the content after '.'. i'm unable to know how do i do it. i'm using the below XSLT line.

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

when i use it, an error is thrown and it is

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

please let me know how i can apply-templates on content after '.'

Thanks.

Upvotes: 0

Views: 675

Answers (2)

Joel M. Lamsen
Joel M. Lamsen

Reputation: 7173

You can try this template

<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>

Upvotes: 2

Martin Honnen
Martin Honnen

Reputation: 167716

With XSLT 1.0 and 2.0 you can only write and apply-templates for nodes, not for primitive values like strings. I think this changes in XSLT 3.0.

In XSLT 2.0, to process the result of substring-after further, you would need to write a function or a named template taking a string parameter.

If you really want to apply a template you first would need to create a temporary text node with xsl:variable.

Upvotes: 0

Related Questions