Как обрезать в xslt? - PullRequest
       63

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

13 голосов
/ 10 декабря 2010

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

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

Ответы [ 4 ]

13 голосов
/ 10 декабря 2010

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

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

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

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

replace(Datas/Data[@key='Name']/string,'^\s*(.+?)\s*$', '$1')
4 голосов
/ 10 декабря 2010

Самый простой способ - использовать шаблонную функцию 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 для обращения строки.

Итак, обработка идет так: :

  1. Устранить начальные пробелы.

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

  3. Устранить начальные пробелы.

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

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

0 голосов
/ 26 ноября 2013

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

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

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

Итак, , если вы предполагаете, что вы попали в ловушку XSLT1 и вашей платформы, пришло время узнать и использовать "зарегистрированные функции".", как в PHP (но любой другой, например, Python или Javascript, использующий LibXML2, может использовать LibXML2 ) для приближения к свободе / функциональности 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, поскольку ожидается, что зарегистрированные функции будут такими же.

...