使用这个 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() and string-length() .
Update1:
OP 问道:
“你的(迪米特·诺瓦切夫)代码是
对于上面的 xml 工作正常。是
您的代码将适用于以下情况
xml?”
<root>
<test>
<node> pass pass </node>
</test>
<test>
<node> fail pass fail </node>
</test>
<test>
<node> pass pass fail </node>
</test>
</root>
Answer:可以使用相同的方法:
<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
。是否可以?
帮帮我吧伙计”
Answer:
同样的方法也适用于问题的这种修改(不过,在一般情况下。您需要一个良好的标记化——请在一个新问题中向我询问这一点):
<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