在XSLT中最后一次出现字符后获取子字符串

lys*_*cid 8 c# xml xslt

我在XML文件中有一个字符串,看起来类似于:

M:Namespace.Class.Method(Something a,something b)

句点(.)字符的数量是有用的,这意味着它可以只有2,如本例所示,但可以更多.

我想使用XSLT从最后一个'.'获取此字符串的子字符串.性格,所以我只剩下:

方法(某事,某事b)

我无法使用标准的substring/substring-after函数实现此目的.

是否有捷径可寻?

Mad*_*sen 22

在XSLT 1.0中,您将需要使用递归模板,如下所示:

  <xsl:template name="substring-after-last">
    <xsl:param name="string" />
    <xsl:param name="delimiter" />
    <xsl:choose>
      <xsl:when test="contains($string, $delimiter)">
        <xsl:call-template name="substring-after-last">
          <xsl:with-param name="string"
            select="substring-after($string, $delimiter)" />
          <xsl:with-param name="delimiter" select="$delimiter" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise><xsl:value-of 
                  select="$string" /></xsl:otherwise>
    </xsl:choose>
  </xsl:template>
Run Code Online (Sandbox Code Playgroud)

并像这样调用它:

<xsl:call-template name="substring-after-last">
  <xsl:with-param name="string" select="'M:Namespace.Class.Method(Something a, Something b)'" />
  <xsl:with-param name="delimiter" select="'.'" />
</xsl:call-template>
Run Code Online (Sandbox Code Playgroud)

在XSLT 2.0中,您可以使用tokenize()函数,只需选择序列中的最后一项:

tokenize('M:Namespace.Class.Method(Something a, Something b)','\.')[last()]
Run Code Online (Sandbox Code Playgroud)