Подтвердить что ты не робот

Как удалить определенные символы из строки с помощью XSLT?

Мне нужно проверить, содержит ли конкретная строка конкретное слово, например, чтобы проверить, SultansOfSwing содержит слово Swing.

Позвольте мне также упомянуть, что значение рассматриваемой строки неизвестно. Как и в этом может быть любое слово, поэтому мы не знаем длины и т.д.

Я понимаю, что могу сделать это, используя ключевое слово contains.

Но как только я знаю, что это слово содержит ключевое слово Swing, я хочу отобразить строку без этого слова "Swing", таким образом эффективно отображая только "SultansOf".

Я пытаюсь исследовать, как я могу достичь этого, но не получить прорыв.

Может кто-нибудь, пожалуйста, сообщите, какое ключевое слово или функция предоставят это средство? Как удалить конкретное слово из строки.

Спасибо за вашу помощь заранее.

С уважением.

лютого

4b9b3361

Ответ 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>