转换此XML时,我需要计算此XML节点中的换行符数
<SpecialInstraction>One
Two
Three
Four
Five
Six
Seven
Eight
Nine
Ten
Eleven
twelve
thirteen
fourteen
fifteen</SpecialInstraction>
如上例所示,有14个换行符。
我尝试确定“

”和“
”的出现次数,但即使上面的XML没有变化,每次此XML进行序列化时,出现次数也会不断变化/反序列化。
任何人都有任何想法如何从XSLT中的XML节点的值获取行数?
答案 0 :(得分:1)
使用强>:
string-length() - string-length(translate(., '
', ''))
虽然通过使用上面的XPath单线程,你根本不需要XSLT,因为这里是完整的:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="text()">
<xsl:value-of select=
"string-length() - string-length(translate(., '
', ''))"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<SpecialInstraction>One
Two
Three
Four
Five
Six
Seven
Eight
Nine
Ten
Eleven
twelve
thirteen
fourteen
fifteen</SpecialInstraction>
产生了想要的正确结果:
14
请注意:
此解决方案onlu计算NL字符的数量。为什么我忽略了CR?仅仅因为根据 W3C XML Specification ,任何兼容的XML解析器都必须执行以下操作:
在任何其他处理之前,所有在XML文档中存在的#xD字符都将被删除或替换为#xA字符 完成。
答案 1 :(得分:0)
在StackOverflow - (count the number of words in a xml node using xsl)上有一个类似的问题,用于计算字符串中的空格数。我已经调整了从那里稍微窃取的代码以使用换行符。
<xsl:template name="word-count">
<xsl:param name="data"/>
<xsl:param name="num"/>
<xsl:variable name="newdata" select="$data"/>
<xsl:variable name="remaining" select="substring-after($newdata,' ')"/>
<xsl:choose>
<xsl:when test="$remaining">
<xsl:call-template name="word-count">
<xsl:with-param name="data" select="$remaining"/>
<xsl:with-param name="num" select="$num+1"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$num = 1">
no words...
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$num"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>