我有变量(数组) - [123, 456, 789]
。我需要提取所有值和输出。我正在使用XSLT 2.0。
示例输入XML
<xsl:param name="pNumbers" select="'[123, 456, 789]'" />
<xsl:template match="Response">
<xsl:copy-of select="."/>
<xsl:element name="Numbers">
<xsl:element name="Number">
<xsl:value-of select="$pNumbers"/>
</xsl:element>
</xsl:element>
</xsl:template>
我需要
<Numbers>
<Number>
123
</Number>
<Number>
456
</Number>
<Number>
789
</Number>
</Numbers>
此外,值可以是数组中的一个 - [123]
<Numbers>
<Number>
123
</Number>
</Numbers>
使用xsl:for-each没有实现这一点。
UPD:
几乎,但不是最后一个元素
<xsl:template name="split">
<xsl:param name="str" select="."/>
<xsl:choose>
<xsl:when test="contains($str, ',')">
<xsl:element name="Number">
<xsl:value-of select="normalize-space(substring-before($str, ','))"/>
</xsl:element>
<xsl:call-template name="split">
<xsl:with-param name="str" select="substring-after($str, ',')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:element name="Number">
<xsl:value-of select="$pNumbers"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
UPD2
解决了XSLT 1.0。谢谢。
<xsl:template name="split">
<xsl:param name="str" select="."/>
<xsl:choose>
<xsl:when test="contains($str, ',')">
<xsl:element name="Number">
<xsl:value-of select="normalize-space(substring-before($str, ','))"/>
</xsl:element>
<xsl:call-template name="split">
<xsl:with-param name="str" select="substring-after($str, ',')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:element name="Number">
<xsl:value-of select="normalize-space($str)"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="Numbers">
<xsl:element name="Number">
<xsl:call-template name="split">
<xsl:with-param name="str" select="substring-before(
substring-after(
$pNumber, '[' )
,']' )" />
</xsl:call-template>
</xsl:element>
</xsl:template>
答案 0 :(得分:1)
如果 - 看起来 - 您的参数是字符串,则需要对其进行标记。在XSLT 2.0中,这可能比您开始做的简单得多:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNumbers" select="'[123, 456, 789]'" />
<xsl:template match="/">
<Numbers>
<xsl:for-each select="tokenize(substring($pNumbers, 2, string-length($pNumbers) - 2), ', ')">
<Number>
<xsl:value-of select="."/>
</Number>
</xsl:for-each>
</Numbers>
</xsl:template>
</xsl:stylesheet>
<强>结果强>
<Numbers>
<Number>123</Number>
<Number>456</Number>
<Number>789</Number>
</Numbers>
如果您可以控制参数的格式,请删除周围的方括号。然后它会变得更简单。