Используйте этот однострочный XPath :
string-length(normalize-space(node))
-
string-length(translate(normalize-space(node),' ','')) +1
Вот краткая проверка с использованием XSLT :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:value-of select=
" string-length(normalize-space(node))
-
string-length(translate(normalize-space(node),' ','')) +1"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному XML-документу :
<root>
<node> count the number of words </node>
</root>
, требуется требуемый, правильный результат:
5
Объяснение : Использованиестандартных функций XPath normalize-space()
, translate()
и string-length()
.
Update1 :
ОП спросил:
"Ваш (Димитр Новатчев) код работает нормально для вышеупомянутого xml. Будет ли ваш код работать для следующего xml? "
<root>
<test>
<node> pass pass </node>
</test>
<test>
<node> fail pass fail </node>
</test>
<test>
<node> pass pass fail </node>
</test>
</root>
Ответ : Можно использовать тот же подход:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:value-of select=
"string-length(normalize-space(.))
-
string-length(translate(normalize-space(.),' ','')) +1
"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование используется во вновь предоставленном XML-документе (см. Выше), будет получен требуемый правильный ответ :
8
Update2 : OP затем спросил вкомментарий:
"Могу ли я сравнить словав узле с некоторым словом по умолчанию.Рассмотрим узел, содержащий значение "pass pass fail"
.Я хочу рассчитать количество проходов и количество неудач.Нравится pass=2 fail=1
.Является ли это возможным?Помоги мне, человек "
Ответ :
Тот же самый подход работает и с этой модификацией проблемы (хотя в общем случае.хорошая токенизация - спросите меня об этом в новом вопросе, пожалуйста):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node">
pass: <xsl:value-of select=
"string-length()
-
string-length(translate(.,'p',''))
"/>
<xsl:text/> fail: <xsl:value-of select=
"string-length()
-
string-length(translate(.,'f',''))
"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к последнему XML-документу (см. выше), создается искомое правильное:
pass: 2 fail: 0
pass: 1 fail: 2
pass: 2 fail: 1