Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用XSLT从字符串中删除特定字符?_Xslt - Fatal编程技术网

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

如何使用XSLT从字符串中删除特定字符?,xslt,Xslt,我需要检查一个特定的字符串是否包含一个特定的单词,例如, SultansOfSwing包含Swing这个词 我还要提到,所讨论的字符串的值是未知的。因为它可以是任何单词,所以我们不知道长度等等 我知道我可以通过使用contains关键字来实现这一点 但是一旦我知道这个单词包含Swing关键字,我就想显示没有这个“Swing”单词的字符串。。因此,有效地只显示“SultansOf” 我一直在努力探索如何实现这一目标,但没有任何突破 有人能告诉我哪个关键字或函数可以提供这个功能吗?如何从字符串中删除

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

我还要提到,所讨论的字符串的值是未知的。因为它可以是任何单词,所以我们不知道长度等等

我知道我可以通过使用contains关键字来实现这一点

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

我一直在努力探索如何实现这一目标,但没有任何突破

有人能告诉我哪个关键字或函数可以提供这个功能吗?如何从字符串中删除特定单词

提前谢谢你的帮助

问候


Dire

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

编辑-需要将$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>

给定以下输入:

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

谢谢你的回答。。为了更好地解释我的问题,这就是我要做的。现在,测试将从我的SQL和java查询中获取值。我想通过查看是否有以_Swing结尾的单词来进一步过滤这个变量值。。。如果是,则删除它,否则显示它。我不知道retreived这个词可能是什么。你能帮我更好地理解这个场景吗?如何做到这一点?感谢此函数的参数本身可以是变量,您不必硬编码它们,只需输入外部查询的结果即可。如果任务只是“返回所有内容(在某个字符串之前)”,那么只需在(concat($variable,$stopword),$stopword)之前使用一行XPath
子字符串即可。谢谢您的回答。。为了更好地解释我的问题,这就是我要做的。现在,测试将从我的SQL和java查询中获取值。我想通过查看是否有以_Swing结尾的单词来进一步过滤这个变量值。。。如果是,则删除它,否则显示它。我不知道retreived这个词可能是什么。你能帮我更好地理解这个场景吗?如何做到这一点?Thank如果Swing部件存在,请仅删除它,否则将显示完整的单词。首先,不要执行
-而是使用
。这对于XSLT引擎来说更有效,因为您没有为变量创建单独的文档。其次,
将允许您过滤以关键字结尾的案例。第三,
substring-before($test,'u-Swing')
将返回字符串中不带
\u-Swing
后缀的部分。以上代码的其余部分都已经完成了。@lavino:about:“这对于XSLT引擎来说效率更高,因为您没有为变量创建单独的文档。”--您能给我指出一些证据证明这是真的吗?在这种情况下,我应该认为两种调用约定在内部是等效的。@Tomalak-
xsl:variable-select=
vs
xsl:variable-xsl:value-of-select=
-
<?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>
<?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>