使用EXSLT str:tokenize将字符串拆分为单独的单词

时间:2013-10-23 05:32:43

标签: xml xslt xslt-1.0

我将字符串标记为空格分隔的单词

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:str="http://exslt.org/strings" exclude-result-prefixes="str">
<xsl:include href="str.tokenize.xsl"/>
<xsl:template match="/string/upara">
    <root>
        <xsl:for-each select="str:tokenize(.,'&#xA;')">
            <row>
                <xsl:for-each select="str:tokenize(.,',')">
                    <elem><xsl:value-of select="."/></elem>
                </xsl:for-each>
            </row>
        </xsl:for-each>
    </root>
</xsl:template>

它始终在第一行的str:tokenize()函数处停止。问题是什么?我正在使用 Altova XML Spy

期望的行为:

Input:This is a small string
Output: 4 2 1 5 6

每个单词的输出长度

1 个答案:

答案 0 :(得分:0)

您提供的XSLT示例首先按换行符拆分输入字符串,然后对每一行用comman拆分它(因此,它用于处理CSV文件)

如果你只是处理一行,并希望用空格分割,你可以这样做

<xsl:for-each select="str:tokenize(.,' ')">

然后你可以使用 string-length 来查找每个单词的长度。

试试这个模板

<xsl:template match="/string/upara">
    <root>
        <xsl:for-each select="str:tokenize(.,' ')">
            <xsl:value-of select="string-length(.)" />
            <xsl:text> </xsl:text>
        </xsl:for-each>
    </root>
</xsl:template>

编辑:如果您使用的是Altova XML SPY,那么我相信这支持XSLT 2.0。这意味着您不需要包含任何EXSLT扩展函数,因为XSTL 2.0作为内置的标记化函数

请尝试使用此XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/string/upara">
    <root>
        <xsl:for-each select="tokenize(.,' ')">
            <xsl:value-of select="string-length(.)" />
            <xsl:text> </xsl:text>
        </xsl:for-each>
    </root>
</xsl:template>
</xsl:stylesheet>