子串操作

时间:2012-02-08 13:26:35

标签: xslt xslt-2.0

我正在将html转换为XML,并且一切正常但我在将原始路径结构转换为新路径时遇到了一些麻烦。

下面的例子解释了我想要实现的目标:

我现在所拥有的(简化示例):

<links>
<link>../../../folder1/folder2/folder3/folder4/somefile.png</link>
<link>../../../foldera/folderb/folder/some_other_file.gif</link>
<link>folder_x/yet_another_file.jpg</link>
</links>

我想得到什么:

<links>
<link>somefile.png</link>
<link>some_other_file.gif</link>
<link>yet_another_file.jpg</link>
</links>

或者换句话说,使用xslt(2)在我的文本中的最后一个“/”之后获取字符串的最简单的方法

感谢您对此提出任何建议!

3 个答案:

答案 0 :(得分:3)

简单地说就是这样。

<xsl:template match="link">
  <xsl:copy>
    <xsl:value-of select="tokenize(., '/')[last()]"/>
  </xsl:copy>
</xsl:template>

当然加上身份转换,例如

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

答案 1 :(得分:1)

尝试使用

<xsl:output method="text"/>

<xsl:function name="xfn:substringAfterLast">
  <xsl:param name="arg"/> 
  <xsl:param name="delim"/> 

  <xsl:sequence select="replace ($arg,concat('^.*',xfn:escapeForRegex($delim)),'')"/>
</xsl:function>

<xsl:function name="xfn:escapeForRegex" >              
    <xsl:param name="arg"/> 
   <xsl:sequence select="replace($arg, '(\.|\[|\]|\\|\||\-|\^|\$|\?|\*|\+|\{|\}|\(|\))','\\$1')"/>
</xsl:function>

<xsl:template match="/">
    <xsl:value-of select="xfn:substringAfterLast('../../../folder1/folder2/folder3/folder4/somefile.png', '/')"/>
    <xsl:apply-templates/>
</xsl:template>

当然,这还需要一个额外的命名空间声明。

答案 2 :(得分:0)

编辑:这不起作用,请参阅评论

您可以使用substring-after功能来实现此目的。迭代link个节点,路径将是

<xsl:variable name="lastPart" select="substring-after(text(.), '/')"/>

$lastPart现在将包含字符串中最后一个/右侧的内容。如果没有这样的字符,这将返回空字符串,因此您可能需要为此提供额外的检查。