如何使用XSLT从字符串中删除特定字符?

时间:2009-07-20 12:27:41

标签: xslt

我需要检查特定字符串是否包含特定单词,例如检查是否, SultansOfSwing包含Swing这个词。

我还要提一下,有问题的字符串的值是未知的。因为它可以是任何单词所以我们不知道长度等等。

我知道我可以使用contains关键字来完成此操作。

但是一旦我知道这个单词包含Swing关键字,我想显示没有这个“Swing”字样的字符串..因此只能有效地显示“SultansOf”。

我一直试图探索如何实现这一目标,但没有得到任何突破。

有人可以告知哪个关键字或功能会提供此功能吗?如何从字符串中删除特定单词。

提前感谢您的帮助。

问候。

2 个答案:

答案 0 :(得分:4)

鉴于此输入:

<root>
    <song>SultansOfSwing</song>
    <song>SwingOfSultans</song>
    <song>SultansSwingOf</song>
</root>

输出:

<?xml version='1.0' ?>
<root>
    <swing-less-long>SultansOf</swing-less-long>
    <swing-less-long>OfSultans</swing-less-long>
    <swing-less-long>SultansOf</swing-less-long>
</root>

可以从中得到。请注意使用substring-beforesubstring-after

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="root/song"/>
        </root>
    </xsl:template>
    <xsl:template match="song">
        <swing-less-long>
            <xsl:if test="contains(., 'Swing')">
                <xsl:call-template name="remove">
                    <xsl:with-param name="value" select="."/>
                </xsl:call-template>
            </xsl:if>
        </swing-less-long>
    </xsl:template>
    <xsl:template name="remove">
        <xsl:param name="value"/>
        <xsl:value-of select="concat(substring-before($value, 'Swing'), substring-after($value, 'Swing'))"/>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

我认为这个字符串替换函数非常详尽:

编辑 - 需要将$ string更改为$ string2。现在应该工作

<xsl:template name="string-replace">
  <xsl:param name="string1"     select="''" />
  <xsl:param name="string2"     select="''" />
  <xsl:param name="replacement" select="''" />
  <xsl:param name="global"      select="true()" />

  <xsl:choose>
    <xsl:when test="contains($string1, $string2)">
      <xsl:value-of select="substring-before($string1, $string2)" />
      <xsl:value-of select="$replacement" />
      <xsl:variable name="rest" select="substring-after($string1, $string2)" />
      <xsl:choose>
        <xsl:when test="$global">
          <xsl:call-template name="string-replace">
            <xsl:with-param name="string1"     select="$rest" />
            <xsl:with-param name="string2"     select="$string2" />
            <xsl:with-param name="replacement" select="$replacement" />
            <xsl:with-param name="global"      select="$global" />
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$rest" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$string1" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

这是区分大小写的,请注意。在你的情况下:

<xsl:call-template name="string-replace">
  <xsl:with-param name="string1"     select="'SultansOfSwing'" />
  <xsl:with-param name="string2"     select="'Swing'" />
  <xsl:with-param name="replacement" select="''" />
</xsl:call-template>