首页 > 解决方案 > 在 XSL 中从变量中的文件名中删除路径

问题描述

我在 Oxygen 工作,正在使用 Saxon。

我正在搜索一堆 xml 文件以搜索 jpg 名称。我正在创建如下变量:

<xsl:variable name="allxml" 
select="collection('..//xml/?select=*.xml;recurse=yes')"/>
<xsl:variable name="jpgs" select="$allxml//element/@n"/>

$jpgs 看起来像:

dir1/jpg001.jpg dir1/jpg002.jpg dir1/jpg003.jpg

等等

我想剥离目录信息,但我很难过。我试过使用 tokenize()and substring-after(),但都返回类似的错误。

“fn:tokenize() ("dir1/jpg001.jpg", "dir1/jpg002.jpg" "dir1/jpg003.jpg") 的第一个参数不允许包含多个项目的序列。"

因为我不知道自己在做什么,所以我不知道自己做错了什么。谁能帮我弄清楚?

标签: xslt

解决方案


您没有显示您的代码,但从错误消息中听起来好像您尝试应用tokenize($jpgs).

错误消息告诉您第一个参数tokenize()必须是单个字符串,但您给它的是一个字符串序列。

您需要应用tokenize()到值序列中的每个项目$jpgs

您可以使用xsl:for-eachto 迭代序列中的项目:

<xsl:for-each select="$jpgs">
  <xsl:sequence select="tokenize(., '/')[last()] "/>
</xsl:for-each>

或者您可以使用 for 表达式:

<xsl:sequence select="for $path in $jpgs return tokenize($path, '/')[last()] "/>

推荐阅读