Удалить символы с помощью xsl

Мне нужно удалить следующие символы из строкового значения, используяxsl 1.0

*, /, \, #, %, !, @, $, (, ), &

Я придумал следующее:

translate(translate(translate(string(//xpath/@value),'.',''),'/',''),',','')

При описанном выше подходе мне пришлось бы дублировать один и тот же код много раз (по одному разу на символ).

Как я могу достичь той же цели, не дублируя код?

Спасибо :-)

Ответы на вопрос(2)

Решение Вопроса

translate(//foo/@value, '*\%[email protected]$&', '') в чистом XPath, соответственно внутри XML-документа, такого как таблица стилей XSLT, вам нужно экранировать<xsl:value-of select="translate(//foo/@value, '*\%[email protected]$&amp;', '')"/>.

translate() функция принимает в качестве второго и третьего аргумента двастроки - не просто два персонажа.

создает строку, которая является строковым значением узла контекста (текущего), в котором любое вхождение символа в$string1 удален

Поэтому вы можете использовать:

translate(expressionSelectingNode, "/\#%[email protected]$()&", "")

удалить любой из символов, содержащихся во втором аргументе.

Конечно, еслиtranslate() Функция используется в таблице стилей XSLT (или, как правило, в документе XML), некоторых специальных символах, таких как< а также& должен быть экранирован соответственно как&lt; а также&amp;.

Использование этого настолько мощно, что можно удалить наборнеизвестный персонажи:

Представьте, что вы хотите удалить из любой строки все символы, которые не являются числовыми. Мы не знаем заранее, какие символы будут присутствовать в строке, поэтому мы не можем просто перечислить их во втором аргументеtranslate(), Однако мы все еще можем удалить все эти неизвестные символы следующим образом:

translate(., translate(., '0123456789', ''), '')

Внутреннийtranslate() производит строку без каких-либо цифр.

Внешнийtranslate() удаляет все эти нецифровые символы (найденные внутреннимtranslate()) из исходной строки - поэтому остаются только цифры.

 Beska26 дек. 2017 г., 20:32
Но разве перевод не требует трех параметров? (Когда я попробовал этот код как есть, он пожаловался на это для меня. Мне пришлось добавить путь в качестве первого параметра.)
 Dimitre Novatchev26 дек. 2017 г., 21:11
@Beska Вы правы - здесь не хватает 1-го аргумента, который является контекстным узлом. - так это должно быть:translate(.,translate(., '0123456789', ''), '') Я уже отредактировал ответ. Спасибо, что заметили это!
 Beska26 дек. 2017 г., 17:49
Это было очень полезно для меня, но вtranslate(translate(., '0123456789', ''), '') строка, я думаю, что внешний перевод не имеет свой первый параметр, нет?
 Dimitre Novatchev26 дек. 2017 г., 18:54
@Beska, нет, внешнийtranslate() имеет в качестве 1-го аргумента результат внутреннегоtranslate()и в качестве второго аргумента пустая строка. Итак, аргументы таковы: 1.translate(., '0123456789', '') и 2.''

Ваш ответ на вопрос