Удаление символов с помощью xsl
Мне нужно удалить следующие символы из строкового значения, используя xsl 1.0
*, /, \, #, %, !, @, $, (, ), &
Я придумал следующее:
translate(translate(translate(string(//xpath/@value),'.',''),'/',''),',','')
В приведенном выше подходе мне придется дублировать один и тот же код много раз (один раз за символ).
Как я могу достичь той же цели, не дублируя код?
Спасибо: -)
Ответы
Ответ 1
Вам просто нужно translate(//foo/@value, '*\%[email protected]$&', '')
в чистом XPath, соответственно, внутри документа XML, такого как таблица стилей XSLT, вам нужно избежать амперсанда <xsl:value-of select="translate(//foo/@value, '*\%[email protected]$&', '')"/>
.
Ответ 2
Функция translate()
принимает в качестве второго и третьего аргументов две строки - не только два символа.
translate(., $string1, '')
создает строку, которая является строковым значением контекста (текущего) node, в котором удаляется любое появление символа, находящегося в $string1
.
Поэтому вы можете использовать:
translate(expressionSelectingNode, "/\#%[email protected]$()&", "")
, чтобы удалить любой из символов, содержащихся во втором аргументе.
Конечно, если функция translate()
используется в таблице стилей XSLT (или, как правило, в документе XML), некоторые специальные символы, такие как <
и &
, должны быть экранированы соответственно как <
и &
.
Используя это настолько мощно, что можно удалить набор неизвестных символов:
Представьте, что вы хотите удалить из любой строки все символы, которые не являются числовыми. Мы не знаем заранее, какие символы будут присутствовать в строке, поэтому мы не можем просто перечислить их во втором аргументе translate()
. Однако мы все равно можем удалить все эти неизвестные атрибуты:
translate(., translate(., '0123456789', ''), '')
Внутренний translate()
создает строку без каких-либо цифр.
Внешний translate()
удаляет все эти нецифровые символы (найденные внутренним translate()
) из исходной строки, поэтому остается только символ цифры.