Как обрезать 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,
потому что ожидается, что зарегистрированные функции будут одинаковыми.