要在 XSLT 1.0 中执行此操作,您需要创建一个命名模板,该模板将递归调用自身。它会将要拆分的字符串作为参数,以及要拆分的分隔符
<xsl:template name="split">
<xsl:param name="text" select="." />
<xsl:param name="delimiter" select="'!#'" />
注意,在这种情况下,参数中的“选择”值是默认值,只有在没有显式参数传递给模板时才适用。
在模板中,如果文本包含分隔符,您将输入文本
<xsl:choose>
<xsl:when test="contains($text, $delimiter)">
如果是这样,您将使用substring-before 输出字符串的第一部分,然后使用substring-after 递归调用命名模板
<td><xsl:value-of select="substring-before($text, $delimiter)" /></td>
<xsl:call-template name="split">
<xsl:with-param name="text" select="substring-after($text, $delimiter)" />
<xsl:with-param name="delimiter" select="$delimiter" />
</xsl:call-template>
文本不包含分隔符时,直接输出即可。
例如,给定以下 XML
<Invoice>
<AllowanceChargeReason>ISK:y!#x!#w!#q!#t!#</AllowanceChargeReason>
</Invoice>
还有下面的 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="AllowanceChargeReason">
<table>
<tr>
<xsl:call-template name="split">
<xsl:with-param name="text" select="substring-after(., ':')" />
</xsl:call-template>
</tr>
</table>
</xsl:template>
<xsl:template name="split">
<xsl:param name="text" select="." />
<xsl:param name="delimiter" select="'!#'" />
<xsl:if test="$text != ''">
<xsl:choose>
<xsl:when test="contains($text, $delimiter)">
<td><xsl:value-of select="substring-before($text, $delimiter)" /></td>
<xsl:call-template name="split">
<xsl:with-param name="text" select="substring-after($text, $delimiter)" />
<xsl:with-param name="delimiter" select="$delimiter" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="$text" /></td>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
那么下面是输出
<table>
<tr>
<td>y</td>
<td>x</td>
<td>w</td>
<td>q</td>
<td>t</td>
</tr>
</table>
请注意,当您将其应用于实际的 XML 示例时,您必须考虑命名空间。