Как удалить определенные символы из строки, используя XSLT? - PullRequest
12 голосов
/ 20 июля 2009

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

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

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

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

Я пытался выяснить, как мне этого добиться, но безуспешно.

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

Заранее спасибо за помощь.

Привет.

Dire

Ответы [ 2 ]

4 голосов
/ 20 июля 2009

Учитывая это для ввода:

<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>
1 голос
/ 20 июля 2009

Я думаю, что эта функция замены строк довольно исчерпывающая:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...