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

#xml #xslt #xslt-2.0

#xml #xslt #xslt-2.0

Вопрос:

Мне нужно удалить double из строки с помощью single с помощью XSLT.

Например: 31646331175 : Мне нужен вывод этого как 31646331175.

Если есть только один плюс или плюса вообще нет, то полностью игнорируйте строку.

Комментарии:

1. Вы пробовали использовать replace функцию ( maxtoroq.github.io/xpath-ref/fn/replace.html ) затем? Как произошел сбой?

2. Я согласен с Мартином, здесь. replace() функция, похоже, подходит. Но вы уверены, что хотите заменить на , а не также «свернуть» на ?

3. да, Martin replace выдает мне эту ошибку: Описание: Синтаксическая ошибка при символе 0 в регулярном выражении: Нет выражения перед квантором, я пытался использовать <xsl:value-of select=»заменить ($value, ‘ ‘, ‘ ‘)»/>

Ответ №1:

Вы можете сделать это с помощью функции XSLT-2.0 analyze-string .
Таким образом, следующий код XSLT мог бы выполнить эту работу:

Введите XML:

 <root>
    <str>  0049134-343-285</str>
    <str> 00421335-645-784</str>
    <str>49134543-346-283</str>
    <str>  0042134-347-282</str>
    <str>  0041134-349-282</str>
</root>
  

Обработка файла XSLT-2.0:

 <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="/root/str">
        <xsl:analyze-string select="text()" regex=" ( .*)">
            <xsl:matching-substring>
                <xsl:value-of select="regex-group(1)"/><xsl:text>amp;#xa;</xsl:text>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </xsl:template>

</xsl:stylesheet>
  

Вывод:

  0049134-343-285
 0042134-347-282
 0041134-349-282
  

Другой комбинацией шаблонов может быть следующая, использующая matches функцию:

 <xsl:template match="text()" />

<xsl:template match="str[matches(text(),'^  [^ ] ')]">
  <xsl:value-of select="substring-after(text(),' ')"/><xsl:text>amp;#xa;</xsl:text>
</xsl:template>
  

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

Комментарии:

1. Это кажется чрезмерно сложным по сравнению с простым вызовом replace().