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