如何在字符串的最后元素中执行xslt中的递归删除

时间:2013-06-20 16:33:50

标签: xslt

在我的一条xml消息中,我有一个特定的标签,其中一些(未知)的最后位置填充了特定字符(/)。但是在XSLT期间,我想删除这个字符,并在最后位置生成另一个字符串。

2 个答案:

答案 0 :(得分:1)

您的问题非常模糊,但您可以创建一个身份转换,以递归方式复制每个元素,并为您要修改的元素添加特殊模板,例如

<xsl:template match="particular-tag">
  <xsl:copy>
    <xsl:value-of select="substring-before(., '/')"/>
  </xsl:copy>
</xsl:template>

这将从每个<particular-tag>元素中删除第一个斜杠中的所有字符。

答案 1 :(得分:0)

如果我正确理解了这个问题,你有一个字符串可能以零或多个斜杠结尾;你想要一个函数或模板从字符串中去除尾部斜杠 - 而不是其他斜杠。在XSLT 2.0中,最简单的方法是编写一个函数来执行此操作。编写函数的方法有很多种;一个简单的就是这个(它将问题概括为从字符串的末尾剥离任何给定的字符,而不仅仅是斜杠):

<xsl:function name="my:strip-trailing-char">
  <xsl:param name="s" required="yes"/>
  <xsl:param name="c" required="yes"/>

  <xsl:choose>
    <xsl:when test="ends-with($s,$c)">
      <xsl:value-of select="my:strip-trailing-char(
             substring($s,1,string-length($s) - 1), 
             $c
      )"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$s"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:function>

在XSLT 1.0中,您可以使用命名模板执行相同的操作:

<xsl:template name="my:strip-trailing-char">
  <xsl:param name="s" required="yes"/>
  <xsl:param name="c" required="yes"/>

  <xsl:choose>
    <xsl:when test="ends-with($s,$c)">
      <xsl:call-template name="my:strip-trailing-char">
        <xsl:with-param name="s" 
          select="substring($s,1,string-length($s) - 1)"/>
        <xsl:with-param name="c" select="$c"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$s"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>