7

我找不到这个问题的确切答案,所以我希望有人能在这里帮助我。

我有一个字符串,我想在最后一个 '.' 之后获取子字符串。我正在使用 xslt 1.0。

这是怎么做到的?这是我的代码。

<xsl:choose>
    <xsl:otherwise> 
        <xsl:attribute name="class">method txt-align-left case-names</xsl:attribute>&#160;
        <xsl:value-of select="./@name"/> // this prints a string eg: 'something1.something2.something3'
    </xsl:otherwise>
</xsl:choose>

当我粘贴建议的代码时,我收到一条错误消息。“解析 XSLT 样式表失败。”

4

4 回答 4

18

我想不出用 XSLT 1.0 中的单个表达式来做到这一点的方法,但是您可以使用递归模板来做到这一点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <n>
      <xsl:call-template name="GetLastSegment">
        <xsl:with-param name="value" select="'something1.something2.something3'" />
        <xsl:with-param name="separator" select="'.'" />
      </xsl:call-template>
    </n>
  </xsl:template>

  <xsl:template name="GetLastSegment">
    <xsl:param name="value" />
    <xsl:param name="separator" select="'.'" />

    <xsl:choose>
      <xsl:when test="contains($value, $separator)">
        <xsl:call-template name="GetLastSegment">
          <xsl:with-param name="value" select="substring-after($value, $separator)" />
          <xsl:with-param name="separator" select="$separator" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$value" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

结果:

<n>something3</n>
于 2013-07-04T11:30:08.807 回答
3

我对 xsl:function 做了同样的行为——然后使用就简单了一点:

<xsl:function name="ns:substring-after-last" as="xs:string" xmlns:ns="yourNamespace">
    <xsl:param name="value" as="xs:string?"/>
    <xsl:param name="separator" as="xs:string"/>        
    <xsl:choose>
        <xsl:when test="contains($value, $separator)">
            <xsl:value-of select="ns:substring-after-last(substring-after($value, $separator), $separator)" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$value" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:function>

您可以直接在 value-of 中调用它:

<xsl:value-of select="ns:substring-after-last(.,'=')" xmlns:ns="yourNamespace"/>  
于 2014-11-12T10:27:50.443 回答
2

这是使用EXSLT str:tokenize的解决方案:

<xsl:if test="substring($string, string-length($string)) != '.'"><xsl:value-of select="str:tokenize($string, '.')[last()]" /></xsl:if> 

if这里是因为如果您的字符串以分隔符结尾,tokenize 将不会返回空字符串)

于 2015-04-02T11:37:50.170 回答
0

我解决了

<xsl:call-template name="GetLastSegment">
<xsl:with-param name="value" select="./@name" />
</xsl:call-template>

不需要

<xsl:with-param name="separator" value="'.'" />

在模板调用中

于 2013-07-05T11:28:48.647 回答