要在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示例。
XSLT沒有「數組」類型。請顯示您正在使用的XML格式良好的樣本作爲輸入,您試圖實現的相應輸出以及迄今嘗試使用的XSLT。 –
搜索* tokenize *。 –
您可以使用XSLT 2.0還是僅限於1.0版本? –