Как обрезать xslt?

Я хочу обрезать пробелы влево и вправо в:
<xsl:value-of select="Datas/Data[@key='Name']/string"/>

Как я могу это сделать?

Ответы

Ответ 1

Самый простой способ - использовать функцию шаблона trim FXSL.

Это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="trim.xsl"/>
<xsl:output method="text"/>

  <xsl:template match="/">
    '<xsl:call-template name="trim">
        <xsl:with-param name="pStr" select="string(/*)"/>
    </xsl:call-template>'
  </xsl:template>
</xsl:stylesheet>

при применении к этому XML-документу:

<someText>

   This is    some text   

</someText>

создает желаемый, правильный результат:

'This is    some text'

Как trim работает:

Легко исключить все начальные пробельные символы в строке, но сложная часть состоит в том, чтобы устранить все конечные пробельные символы.

Функция/шаблон FXSL trim достигает этого, используя другой шаблон/функцию FXSL для изменения строки.

Итак, обработка выполняется следующим образом:

  • Исключить ведущее белое пространство.

  • Обратный результат.

  • Устранить лидирующие пробелы.

  • Наконец, обратное.

Полный код для trim() в FXSL 2.0 (для XSLT 2.0) можно увидеть здесь. Это почти то же самое, что и код для шаблона trim для FXSL 1.0 (для XSLT 1.0).

Ответ 2

normalize-space(Datas/Data[@key='Name']/string) может быть достаточно, он обрезает пробел и начало и конец. Однако он также разрушает любое пустое пространство между одним пространством, я не знаю, хотите ли вы этого.

Ответ 3

Предлагая другое решение, которое я использую в XSLT 2.0, поскольку оно более кратким и точным (normalize-space не является обрезкой).

Используйте функцию replace и регулярное выражение для захвата внутреннего содержимого минус предыдущее и конечное пробелы.

replace(Datas/Data[@key='Name']/string,'^\s*(.+?)\s*$', '$1')

Ответ 4

Сравните решение @ricosrealm, для пользователей XSLT2, с @Dimitre для XSLT1 (и проверьте также количество строк FXSL-обрезки). Функция замены регулярных выражений настолько проста, тратит меньше процессорного времени и меньше времени программиста.

Для пользователей XSLT1 в 2013 году

Если вы являетесь пользователем XSLT1, вероятно, потому, что у вас нет выбора для использования XSLT2. Пример: PHP зависит от реализации LibXML2, который был остановлен в стандарте 1999 года, а не реализует стандарт 2007 года. Сегодня (2013) лишь небольшая часть пользователей XSLT1 делает это по соображениям производительности.

Итак, , если вы предполагаете, что вы попали в ловушку XSLT1 и вашей фреймворк, пришло время узнать и использовать "зарегистрированные функции" , как на PHP (но любой другой, такой как Python или Javascript с использованием LibXML2, может использовать LibXML2 extensions), чтобы приблизиться к XSLT2 свобода/функциональность.
См. XSLTProcessor:: registerPHPFunctions на вашем языке.

Пример PHP:

  <xsl:value-of 
       select="php:functionString( 'trim', Datas/Data[@key='Name']/string )"
  />

ПРИМЕЧАНИЕ (отредактировано): для реализаций, отличных от libXML2, например, в средах Microsoft (.NET), как показано @ChristopheDebove (комментарии ниже), существуют также решения для зарегистрированных функций. Конечно, для Java есть SAXON, единственный хороший открытый источник XSLT2 сегодня.

... Если однажды (см. мнения о здесь и здесь), вы заменяете XSLT1 на XSLT2 в той же структуре (например, PHP), вам не нужно менять сценарии XSLT, потому что ожидается, что зарегистрированные функции будут одинаковыми.