1

转换此 XML 时,我需要计算此 XML 节点中的换行数

    <SpecialInstraction>One
Two
Three
Four
Five
Six
Seven
Eight
Nine
Ten
Eleven
twelve
thirteen
fourteen
fifteen</SpecialInstraction>

像上面的例子一样有 14 个换行符。

我试图确定“ &#xD;&#xA;”和“ &#13;”的出现次数,但即使上述 XML 没有变化,每次此 XML 进行序列化/反序列化时,出现的次数也会不断变化。

有人知道如何从 XSLT 中的 XML 节点的值中获取行数吗?

4

2 回答 2

1

使用

string-length() - string-length(translate(., '&#xA;', ''))

虽然通过使用上面的 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(., '&#xA;', ''))"/>
 </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 规范,任何兼容的 XML 解析器都必须执行以下操作:

在完成任何其他处理之前,XML 文档中字面上存在的所有 #xD 字符都将被删除或替换为 #xA 字符。

于 2012-06-28T11:38:09.783 回答
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,'&#10;')"/>                

        <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>
于 2012-06-28T10:07:39.240 回答