2009-09-11 57 views
1

选择我有一段代码,类似于此:重用变量选择,外部的XSLT

<xsl:choose> 
    <xsl:when test="some_test"> 
     <xsl:value-of select="Something" /> 
     You are: 
     <xsl:variable name="age">12</xsl:variable> 
     years 
    </xsl:when> 
</xsl:choose> 

我的问题是,我想用变量$年龄之外的选择。我怎么做?

一个类似的问题是我在我的XSLT文件中有几个模板,其中一个是主模板。这一个:

<xsl:template match="/"> 
</xsl:template> 

在这个模板里面,我调用了其他几个模板,并且我想再次使用其他模板的一些变量。

在举例来说,如果我有这样的代码:

<xsl:template match="/"> 
    <xsl:call-template name="search"> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="search"> 
    <xsl:variable name="searchVar">Something...</xsl:variable> 
</xsl:template> 

然后我想用$ searchVar我的主模板内。

我觉得这是一个相同的问题,但我似乎无法弄清楚这一点。

我顺便说一下:)

我希望你们中的一些有答案运行一把umbraco我的CMS。

感谢 - 金

回答

2

#1:变量是有效的只有自己的父元素中。这意味着你必须把逻辑的变量,而不是“左右”是:

<xsl:variable name="var"> 
    <xsl:choose> 
    <xsl:when test="some_test"> 
     <xsl:text>HEY!</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>SEE YA!</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

到#2:使用参数值输送到模板。

<xsl:template match="/"> 
    <xsl:variable name="var" select="'something'" /> 

    <!-- params work for named templates.. --> 
    <xsl:call-template name="search"> 
    <xsl:with-param name="p" select="$var" /> 
    </xsl:call-template> 

    <!-- ...and for normal templates as well --> 
    <xsl:apply-templates select="xpath/to/nodes"> 
    <xsl:with-param name="p" select="$var" /> 
    </xsl:apply-templates> 
</xsl:template> 

<!-- named template --> 
<xsl:template name="search"> 
    <xsl:param name="p" /> 

    <!-- does stuff with $p --> 
</xsl:template> 

<-- normal template --> 
<xsl:template match="nodes"> 
    <xsl:param name="p" /> 

    <!-- does stuff with $p --> 
</xsl:template> 

输送了值回调用模板,结合上面:

<xsl:template match="/"> 
    <xsl:variable name="var"> 
    <xsl:call-template name="age"> 
     <xsl:with-param name="num" select="28" /> 
    </xsl:call-template> 
    </xsl:variable> 

    <xsl:value-of select="$var" /> 
</xsl:template> 

<xsl:template name="age"> 
    <xsl:param name="num" /> 

    <xsl:value-of select="concat('You are ', $num, ' years yold!')" /> 
</xsl:template> 
+0

您好Tomalak #1: 请参阅我对Scoregraphic的最新评论。刚才在这个问题上做了一个更好的例子。 #2: 问题是不使用其他模板中的主模板中的变量。但要使用主模板中其他模板中定义的变量whos。 – 2009-09-11 11:46:03

+0

#1:看到我的其他评论。顺便说一句,你更新的例子#1没有太大意义。发布*实际*代码比编写与您的真实问题不相似的东西要好。 #2:看到我编辑的答案。 – Tomalak 2009-09-11 12:03:46

0

看一看xsl:param

编辑:未经测试,但可能工作:

<xsl:param name="var"> 
    <xsl:choose> 
    <xsl:when test="some_test"> 
    <xsl:value-of select="string('HEY!')" /> 
    </xsl:when> 
    </xsl:choose> 
</xsl:param> 
+0

我不能使用的内部选择 – 2009-09-11 10:51:01

+0

......我编辑我的回复 – Scoregraphic 2009-09-11 11:20:31

+1

嗯......是的,可能会工作,但实际上我有更多的选择我的变量。 我也有一些纯文本和其他变量。 所以,如果我这样做,名为$ var的变量将包含所有这些信息,这不是这个意思。 – 2009-09-11 11:40:27