这个XSL代码有什么问题?

时间:2013-02-04 20:03:08

标签: xml variables xslt xslcompiledtransform node-set

当我应用变换时,我得到一个异常:表达式必须求值为一个节点集。

  <xsl:for-each select = "some expression">
    <xsl:variable name="a0" select="some expression"/>
    <xsl:variable name="a1" select="some expression"/>
    <xsl:variable name="a2" select="some expression"/>

    <xsl:for-each select="$a0 | $a1 | $a2">
        <xsl:value-of select="."/>
        <xsl:if test="position()!=last()">,</xsl:if>
    </xsl:for-each>

  </xsl:for-each>

现在,如果我将if语句放在第一个循环的级别,那么可以正确应用转换。

如果问题是表达式“$ a0 | $ a1 | $ a2”不被视为节点集,我如何使用XSLT 1.0实现类似目标?

1 个答案:

答案 0 :(得分:3)

正如错误所述,在XSLT 1.0中,您不能使用union运算符来连接不是节点的操作数。

如果您使用的是支持the node-set() function的XSLT处理器,则可以执行以下操作:

<xsl:for-each select="exsl:node-set($a0) | exsl:node-set($a1) | exsl:node-set($a2)">
    <xsl:value-of select="."/>
    <xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>

但如果你打算这样做,你可以这样做:

<xsl:value-of select="concat($a0, ',', $a1, ',', $a2)" />

从你最近提出的一个问题来看,也许你有很多变数,在这种情况下,你的设计可能需要重新思考。如果您可以提供一些细节而不是通用占位符,也许有人可以建议您采用不同的方法。