XSLT通过charlength分割字符串并为每个子字符串调用函数

时间:2014-02-05 21:48:26

标签: xml xslt substring xslt-2.0 tokenize

例如,如果你有一个没有固定长度但总是以2为增量的字符串,我应该如何将字符串拆分成多个部分并为每个子字符串调用一个模板,因为每个子字符串都是对应不同的文字。

<root>
<Data>
<ErrorNumber>12345678</ErrorNumber>
</Data>
</root>

假设错误代码

12 = "Test 1"
34 = "Test 2"
56 = "Test 3"
78 = "Test4"

因此该函数应调用此函数并获取输出

<xsl:template name="GetErrorCode">
<xsl: param name = "ErrorCode"/>
<xsl: if test = "$ErrorCode = '12'">
<xsl:text> Test 1 </xsl:test>
</xsl:if>
</xsl template>

所以基本上如果我作为参数传递12345678我会得到

Test 1
Test 2
Test 3
Test 4

作为输出

1 个答案:

答案 0 :(得分:2)

您可以使用XPath子字符串来提取固定块并将它们分配给XSLT变量:

<xsl:variable name="A"  select="substring(/root/Data/ErrorNumber, 1, 2)"/>
<xsl:variable name="B" select="substring(/root/Data/ErrorNumber, 3, 2)"/>
<xsl:variable name="C"  select="substring(/root/Data/ErrorNumber, 5, 2)"/>
<xsl:variable name="D" select="substring(/root/Data/ErrorNumber, 7, 2)"/>

然后从那里使用测试中的变量。

如果代码的大小不是固定长度,则可以使用下面的模板:

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:choose>
        <xsl:when test="string-length($text) = 2">
            <token><xsl:value-of select="$text"/></token>
        </xsl:when>
        <xsl:otherwise>
            <token><xsl:value-of select="substring($text, 1, 2)"/></token>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring($text, 3, string-length($text)-2)"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

它将返回包含一个或多个元素的节点集,例如,如果您使用:

调用它
<xsl:call-template name="tokenize">
     <xsl:with-param name="text" select="/root/Data/ErrorNumber" />
</xsl:call-template>

如果ErrorNumber为12345678,则会得到一个变量$tokens,其中包含:

<token>12</token>
<token>34</token>
<token>56</token>
<token>78</token>

然后,您可以调用模板传递$tokens/token[2]以获得所需的结果。