Как удалить определенные символы из строки с помощью XSLT?
Мне нужно проверить, содержит ли конкретная строка конкретное слово, например, чтобы проверить,
SultansOfSwing содержит слово Swing.
Позвольте мне также упомянуть, что значение рассматриваемой строки неизвестно. Как и в этом может быть любое слово, поэтому мы не знаем длины и т.д.
Я понимаю, что могу сделать это, используя ключевое слово contains.
Но как только я знаю, что это слово содержит ключевое слово Swing, я хочу отобразить строку без этого слова "Swing", таким образом эффективно отображая только "SultansOf".
Я пытаюсь исследовать, как я могу достичь этого, но не получить прорыв.
Может кто-нибудь, пожалуйста, сообщите, какое ключевое слово или функция предоставят это средство? Как удалить конкретное слово из строки.
Спасибо за вашу помощь заранее.
С уважением.
лютого
Ответы
Ответ 1
Учитывая это для ввода:
<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-before
и substring-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>
Ответ 2
Я думаю, что эта функция замены строк довольно полная:
EDIT - необходимо изменить $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>