How does code return for functions not yet available in XSLT?

How to make unparsed-text-lines () function effective for XSLT 2.0 and XSLT 3.0 processors in the same style-style?

I thought I could use the function-available () function like that, but that returns a syntax error for the XSLT 2.0 processor.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:local="local" version="2.0" exclude-result-prefixes="xs fn local"> <xsl:function name="local:unparsed-text-lines" as="xs:string+"> <xsl:param name="href" as="xs:string" /> <xsl:choose> <xsl:when test="function-available('fn:unparsed-text-lines')"> <!-- XSLT 3.0 --> <xsl:sequence select="fn:unparsed-text-lines($href)" /> </xsl:when> <xsl:otherwise> <!-- XSLT 2.0 --> <xsl:sequence select="fn:tokenize(fn:unparsed-text($href), '\r\n|\r|\n')[not(position()=last() and .='')]" /> </xsl:otherwise> </xsl:choose> </xsl:function> etc. 
+4
source share
1 answer

Problem :

<xsl:when>

is a runtime operator, and the compiler at compile time does not know that its result will be true() or false() .

Solution . Use the use-when attribute.

The conversion becomes something like this:

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:local="local" version="2.0" exclude-result-prefixes="xs local"> <xsl:function name="local:unparsed-text-lines" as="xs:string+"> <xsl:param name="href" as="xs:string" /> <xsl:sequence select="fn:unparsed-text-lines($href)" use-when="function-available('unparsed-text-lines')" /> <xsl:sequence use-when="not(function-available('unparsed-text-lines'))" select="tokenize(unparsed-text($href), '\r\n|\r|\n') [not(position()=last() and .='' ) ]" /> </xsl:function> </xsl:stylesheet> 

, and now no error occurs .

+5
source

Source: https://habr.com/ru/post/1397351/


All Articles