我有这样的xml数据:
<Invoice >
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>ISK:y!#x!#w!#q!#t!#</cbs:AllowanceChargeReason>
<cbc:MultiplierFactorNumeric>0.1</cbc:MultiplierFactorNumeric>
</Invoice>
我必须用!#
字符拆分此AllowanceChargeReason,并将结果放入数组中。并循环使用此数组作为结果我想得到这个结果。如何为下面的结果编写xslt代码?
<table>
<xsl:for-each >
<tr>
.......
</tr>
</xsl>
</table>
结果:
</table>
<table>
<tr>
<td>
y
</td>
<td>
x
</td>
<td>
w
</td>
<td>
q
</td>
</tr>
</table>
答案 0 :(得分:2)
要在XSLT 1.0中执行此操作,您需要创建一个命名模板,该模板将以递归方式调用自身。它将作为参数作为要拆分的字符串,以及要将其拆分的分隔符
<xsl:template name="split">
<xsl:param name="text" select="." />
<xsl:param name="delimiter" select="'!#'" />
注意,在这种情况下,参数中的“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示例时,您必须考虑名称空间。