2014-02-26 51 views
0

嘿,我有我想要在XSL使用一个XSL变量选择标签如何使用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

你是不是使用变量name里面的xsl:choose - 你声明它那里。

要声明xsl:when中的变量,只有在同一元素内使用此变量时才有意义。这是因为范围的一个变量。如果您在xsl:when内声明了局部变量,则不能在外部使用它。

使用xsl:choose只有在测试至少两个不同的条件时才有意义,一个在xsl:when之内,另一个在xsl:otherwise之内。如果只有一个条件,xsl:if就足够了。

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

编辑:为了使其更清楚:不,它不可能在其作用域之外使用局部变量。如果你在xsl:when内声明了一个变量,你将永远无法访问它。

+0

嘿我有更多的xslt样式表。我认为它的范围问题,那么我怎样才能在外面使用这个变量,你可以建议我吗? –

+0

@nrvmodi你试图实现的是什么(我认为)是不可能的。看到我编辑的答案。 –

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> 
+0

我同意你的看法,但我有很多变量,我想在条件基础中定义它......这就是为什么我问,有没有办法做到这一点。 –

0

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