首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT错误检查表达式“funcall(Tokenize)”的类型

XSLT错误检查表达式“funcall(Tokenize)”的类型
EN

Stack Overflow用户
提问于 2022-10-11 20:44:36
回答 1查看 91关注 0票数 0

我试图在字符串中得到与'/‘分开的最新单词,但出于某种原因,我得到了错误

代码语言:javascript
复制
Error checking type of the expression 'funcall(tokenize, [variable-ref(effect/node-set), literal-expr(/)])'.

我知道它只支持xsl版本2,我认为我已经这样做了,就像在xsl文件中所看到的那样。

代码语言:javascript
复制
<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>

如果我用子字符串替换tokenize后,它不会抱怨参数。标记部件的一个小型xml示例

代码语言:javascript
复制
<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>

如果我在这个网站http://xslttest.appspot.com/中使用tokenize函数运行我的代码,它将完美地工作。不知道我在这里错过了什么。

不确定是否值得注意,但我在javax.xml.transform.TransformerFactory的帮助下运行了这个模板

更新:

好的,正如注释中提到的,我将转换器替换为Saxon,它现在捕获字符串,但由于某种原因,它将'/‘替换为’/‘。例如,如果我有aa/ bb /cc,它返回aa bb。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-11 21:20:38

正如Martin在评论中所建议的,将java库更改为使用Saxon版本11.4和使用last()就可以了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74033920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档