如何在xsl:choose中使用xsl:variable

时间:2014-02-26 09:12:08

标签: java xml xslt

嘿我有一个xsl变量,我想在xsl中使用选择标记

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="1 eq whatever">
             <xsl:variable name="name" select="Person/Name"/>
        </xsl:when>
    </xsl:choose>
</xsl:template>

它会给出异常

javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:828)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:617)
    at com.navaera.sunflower.set.util.XmlElementsBuilder.getXMLOutput(XmlElementsBuilder.java:189)

3 个答案:

答案 0 :(得分:3)

你不是name内使用变量xsl:choose - 你在那里声明

如果你在同一个元素中也使用了这个变量,那么在xsl:when中声明一个变量才有意义。这是因为变量的范围。如果在xsl:when内声明局部变量,则无法在外部使用它。

如果您测试至少两个不同的条件,xsl:choose只有xsl:when,另一个在xsl:otherwise内。如果只有一个条件,xsl:if就足够了。

如果您透露更多的XSLT样式表,则可能会告诉您哪里出错了。因此,请使用完整的输入XML和完整的XSLT样式表更新您的问题。

编辑:为了使其更清晰:不,不可能在其范围之外使用局部变量。如果您在xsl:when内声明变量,则永远无法在外部访问它。

答案 1 :(得分:0)

您可以使用全局变量

<xsl:variable name="name" select="Person/Name"/>

并在模板中调用

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="1 eq whatever">
             <xsl:value-of select="$name"/>
        </xsl:when>
    </xsl:choose>
</xsl:template>

答案 2 :(得分:0)

如果你问“我想写+ 3 5”这个问题,你会得到答案“你做不到,语言不允许”。如果您将问题更改为“我想添加三到五”,人们会告诉您写“3 + 5”。所以请解释你的问题,然后我们可以告诉你正确的编码方式。我们无法通过查看错误的代码来解决问题所在。