Это просто:
Использование :
string-length(translate(normalize-space(/*/*/*/v1:EmpNumber), '0123456789',''))+1
При применении к этому документу (предоставляется еще один номер):
<soapenv:Body xmlns:soapenv="my:soapenv">
<v1:MRRequestParam xmlns:v1="my:v1">
<v1:EmpNumberList>
<v1:EmpNumber> 9989071005 2004421004 1234567890 </v1:EmpNumber>
</v1:EmpNumberList>
</v1:MRRequestParam>
</soapenv:Body>
возвращается искомый, правильный результат:
3
Вот полная таблица стилей XSLT 1.0 для запуска и проверки правильности результатов всегда :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="my:soapenv" xmlns:v1="my:v1">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select=
"string-length(
translate(normalize-space(/*/*/*/v1:EmpNumber), '0123456789','')
)+1"/>
</xsl:template>
</xsl:stylesheet>
Do note : Вы должны указать правильные пространства имен в преобразовании и в XML-документе - вы не предоставили их в своем вопросе.
Объяснение :
Значение этого выражения:
string-length(
translate(normalize-space(/*/*/*/v1:EmpNumber), '0123456789','')
)+1
:
normalize-space()
.Он берет строку и создает из нее новую строку, в которой удаляются все начальные и конечные пробельные символы.
Остаются только цифры с одним промежуточным пробеломмежду каждыми двумя числами .Таким образом, если имеется N чисел, количество пробелов равно N-1.
Функция translate()
, указанная в выражении, возвращаетновая строка, в которой пропали все цифры (заменяется пустой строкой ''. Остались только пробелы.
Использование string-length()
function мы просто получаем количество этих пробелов ** (N-1). Добавляем 1 и получаем число N всех чисел в строке.