I am trying to get the latest word in a string that is splitted with ‘/’ but for some reason I get the error
Error checking type of the expression 'funcall(tokenize, [variable-ref(effect/node-set), literal-expr(/)])'.
I know that it is only supported in xsl version 2 and I think that I have done so as can be seen in my xsl file
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" exclude-result-prefixes="xlink" > <xsl:output method="xml" indent="yes" /> <xsl:template match="/"> <Tracks> <xsl:apply-templates select="//Tracks"/> </Tracks> </xsl:template> <xsl:template match= "//MidiTrack"> <MidiTrack> <xsl:attribute name="id"> <xsl:value-of select="@Id"/> </xsl:attribute> <Effects> <xsl:for-each select="descendant::DeviceChain/Devices/*"> <xsl:variable name="effect" select="descendant::LastPresetRef/descendant::RelativePath/@Value"/> <xsl:if test="$effect"> <Name> <xsl:value-of select="substring-after($effect, 'Devices/Audio Effects/')"/> </Name> </xsl:if> </xsl:for-each> </Effects> </MidiTrack> </xsl:template> <xsl:template match= "//ReturnTrack"> <ReturnTrack> <xsl:for-each select="descendant::DeviceChain/Devices/*"> <xsl:variable name="effect" select="descendant::LastPresetRef/descendant::Path/@Value"/> <xsl:if test="$effect"> <Name> <xsl:value-of select="tokenize($effect, '/')"/> </Name> </xsl:if> </xsl:for-each> </Effects> </ReturnTrack> </xsl:template> </xsl:stylesheet>
if I replace the tokenize with substring-after it does not complain about the arguments. A small xml example for the tokenize part
<LastPresetRef> <Value> <FilePresetRef Id="1"> <FileRef> <RelativePathType Value="0" /> <RelativePath Value="" /> <Path Value="/Reverb Default.adv" /> <Type Value="1" /> <LivePackName Value="" /> <LivePackId Value="" /> <OriginalFileSize Value="0" /> <OriginalCrc Value="0" /> </FileRef> </FilePresetRef> </Value> </LastPresetRef>
If I run my code WITH the tokenize function in this website http://xslttest.appspot.com/ it works perfectly. Not sure what I am missing here.
Not sure if it is worth noting but I run this template with the help of javax.xml.transform.TransformerFactory
UPDATE:
Ok so I replaced the Transformer to Saxon as mentioned in the comments and it catches the string now but it replaces ‘/’ with ‘ ‘ for some reason. For example if I have aa/bb/cc it returns aa bb cc
Advertisement
Answer
As Martin suggested in the comments, changing the java library to use Saxon HE version 11.4 and using [last()] did the trick